LINQ to Entity:使用包含在“选择”部分引发意外错误
-
03-07-2019 - |
题
我有一个针对Entity Framework对象的LINQ查询。以下是查询摘要:
//a list of my allies
List<int> allianceMembers = new List<int>() { 1,5,10 };
//query for fleets in my area, including any allies (and mark them as such)
var fleets = from af in FleetSource
select new Fleet
{
fleetID = af.fleetID,
fleetName = af.fleetName,
isAllied = (allianceMembers.Contains(af.userID) ? true : false)
};
基本上,我正在做的是获得一组舰队。 allianceMembers列表包含与我结盟的所有用户的INT。如果车队的所有者是该列表的一部分,我想设置isAllied = true,否则设置为false。
当我这样做时,我看到一个异常:“LINQ to Entities无法识别方法'Boolean Contains(Int32)'方法”
如果我在查询的where部分使用了contains,我可以理解得到这个错误,但为什么我会在select中得到它?到目前为止,我认为查询已执行并返回结果。这个小小的代码根本不会限制我的数据。
关于如何通过设置isAllied标志来完成我需要的任何提示?
由于
解决方案
var fleets = from af in FleetSource;
var x = from u in fleets.ToList()
select new Fleet
{
fleetID = u.fleetID,
fleetName = u.fleetName,
isAllied = (allianceMembers.Contains(u.userID) ? true : false)
}
在车队上调用 ToList()
执行查询,稍后您可以使用 Contains()
。
其他提示
这是从之前的回答中挖掘出来的......
包含不受支持。
IN和JOIN不是同一个运算符(按IN过滤永远不会更改查询的基数)。
使用join方法而不是这样做。
,如果没有使用查询运算符,有点难以理解,但是一旦得到它,就得到它。var foo =
model.entitySet.Join( //Start the join
values, //Join to the list of strings
e => e.Name, // on entity.Name
value => value, //equal to the string
(ModelItem ent, String str) => ent);//select the entity
这里使用查询运算符
var foo = from e in model.entitySet
join val in values on
e.Name equals val
select e;
基本上,实体框架尝试将您的LINQ查询转换为SQL语句,但不知道如何处理 Contains
。
您可以做的是从数据库中检索您的车队并稍后设置isAllied属性:
var fleets = (from af in FleetSource
select new Fleet
{
fleetID = af.fleetID,
fleetName = af.fleetName,
userId = af.userId
}).AsEnumerable();
foreach (var fleet in fleets)
{
fleet.isAllied = (allianceMembers.Contains(fleet.userID) ? true : false);
}
我上面的每个人都错了! (没有冒犯......)它不起作用,因为你正在使用IList重载“Contains”而不是“包含”的IEnumerable重载。只需更改为:
allianceMembers.Contains<int>(af.userID)
通过添加&lt; int&gt;
,您告诉编译器使用IEnumerable重载而不是IList重载。
不隶属于 StackOverflow