我有以下表格
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'类型的元素。 只有原始类型,枚举类型和实体类型 支撑。
如何正确完成? 感谢
答案 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。