我有以下表格
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();
就我个人而言,这意味着你根本不需要了解林克。