2

我有以下表格

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”类型的元素。仅支持原始类型、枚举类型和实体类型。

如何正确执行?谢谢

4

5 回答 5

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

于 2013-02-08T00:35:05.157 回答
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();

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

于 2013-02-08T00:10:00.487 回答
0

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

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

var selection = from a in db.UserMultiplyItems
                from b in db.Users
                where delegateList.Contains(a.ItemID) && a.UserID == b.ID
                select b;
于 2013-02-08T00:41:26.143 回答
-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”,以便于阅读。

于 2013-02-08T00:17:58.993 回答
-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。

于 2013-02-08T00:30:03.043 回答