LINQ请求多对多

时间:2013-02-07 23:44:26

标签: c# linq many-to-many

我有以下表格

Users
 - ID
 - FirstName
 - LastName

MultiplyItems
 - ItemID
 - Title

UserMultiplyItems
 - UserID
 - ItemID

我有一个变量

List<int> delegateList = {1, 3, 5};

其中1,3,5是ItemID

我想选择所有用户,其中至少有一个ItemID链接了可选用户。 我尝试以下方法:

        var result = from i in _dbContext.Users
                     where 
                     ((delegateList == null) || i.MultiplyItems.Any(p=> delegateList.Any(a => a == p.ItemID)))

                     select new UserModel()
                     {
                         ....
                     };

但它不起作用。错误:

  

无法比较'System.Collections.Generic.List`1'类型的元素。   只有原始类型,枚举类型和实体类型   支撑。

如何正确完成? 感谢

5 个答案:

答案 0 :(得分:2)

我会写这个:

var filteredUsers = delegateList == null 
    ? _dbContext.Users
    : _dbContext.Users.Where(user => user.MultiplyItems
        .Any(item => delegateList.Contains(item.Id)));

var result = filteredUsers.Select(user => new UserModel
        {
            //the UserModel initialization
        });

您不应该检查查询中的以下行:

delegateList == null

它被翻译成SQL,SQL不知道什么是List以及如何将它与null进行比较。

答案 1 :(得分:0)

    var result = from i in _dbContext.Users
    from mi in i.multiplyItems
    select new yourClass();

    if(delegateList!=null)
    {
       result = result.Where(delegateList.contains(mi.ItemID));
    }

    result.ToList();

我没有开放视觉工作室进行测试,但它应该很像。

答案 2 :(得分:0)

我不确定这是否是你想要的,但我认为最好尝试和帮助。

这将输出来自Users表的所有用户,其中ItemID包含在delegateList中。魔术放置在Contains运算符中,您可以从列表b中包含的元素中获取元素

var selection = from a in db.UserMultiplyItems
                from b in db.Users
                where delegateList.Contains(a.ItemID) && a.UserID == b.ID
                select b;

答案 3 :(得分:-1)

尝试将其更改为:

var result = from u in _dbContext.Users
where 
((delegateList == null) || u.MultiplyItems.Any( mi => delegateList.Contains(mi.ItemID)))

select new UserModel()
{
 ....
};

注意我还将“i”和“p”的内容重命名为“u”和“mi”,以便于阅读。

答案 4 :(得分:-1)

或者你根本不能使用LINQ,只需坚持使用lambda表达式:

List<UserModel> usersWithItems =
    context
    .Users
    .Where(u => u.MultiplyItems.Any(mi => (delegateList == null) || (delegateList.Contains(mi.ItemID))))
    .Select(um => (new UserModel() { ...  } ) )
    .ToList();

我个人更喜欢,这意味着你根本不需要了解linq。