LINQ要求多对多



我有以下表格

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"类型的元素。只有基元类型、枚举类型和实体类型支持。

如何正确操作?感谢

我会写这个:

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进行比较。

    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();

我没有开放的视觉工作室进行测试,但应该是这样的。

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

这将从用户表中输出所有用户,其中ItemID包含在delegateList中。神奇之处在于Contains运算符,您可以从列表a中获取包含在列表b 中的元素

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

尝试将其更改为:

var result = from u in _dbContext.Users
where 
((delegateList == null) || u.MultiplyItems.Any( mi => delegateList.Contains(mi.ItemID)))
select new UserModel()
{
 ....
};

注意,我还将你的"I"one_answers"p"重命名为"u"one_answers"mi",以便于阅读。

或者,您根本不能使用LINQ,只能使用lambda表达式:

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

就我个人而言,这意味着你根本不需要了解林克。

相关内容

  • 没有找到相关文章