优化LINQ表达式

时间:2015-02-18 09:51:52

标签: c# mysql linq entity-framework optimization

我使用EFF和MySql数据库,我有3个不同的表(比如用户,杂货,usersItems)。情况是 -

  1. UsersItems包含参与杂货购买的用户列表。
    UserInvolvedusers.UserID的外键,而列GroceryIDgroceries.ItemID的外键。
  2. 杂货已经购买了杂货清单。
  3. 用户拥有用户详细信息列表。(仅名称关注表格)
  4. 我想要实现的目标是, groceries 表格中选择一份杂货清单。 根据此列表,我必须从表usersItems获取参与购买这些列表的用户列表。最后,我必须从users表中获取这些用户的名称,并将这些名称显示为;分号。

    这是表格之间的关联 - enter image description here

    这是我试图通过Linq实现的目标

    var gList = entities.groceries.Select(item => item.ItemID);
    var uInvolved = entities.usersitems.Where(item => gList.Contains(item.GroceryId)).Select(u => u.userInvolved);
    var usrs = string.Join(";", entities.users.Where(us => uInvolved.Contains(us.UserID)).Select(name => name.FullName));
    

    通过使用这些linq,我得到的结果是我想要的,但正如你所看到的那样,没有太多优化。总的来说,我想缩短/优化这些查询,我非常困惑,我在哪里出错了。 另外,我曾尝试直接从数据库中以View的形式实现此结果,但我仍然不能。

2 个答案:

答案 0 :(得分:2)

试试这个:

var query = entities.users.Where(u=> u.useritems.SelectMany(ui=> ui.groceries).Any()).Select(u=> u.FullName);

这是使用导航属性...如果你得到一个外键关系...你的导航属性可能名称不同

答案 1 :(得分:0)

您尝试实现的是many-to-many relationship使用bridge table。我建议您查看本教程:https://www.youtube.com/watch?v=uMQwORSTGX4

基本上您需要删除IndexNum列。然后你应该重新生成你的模型,你将能够检查:

var groceries = user.Groceries;
var users = gorcery.Users;