LINQ to Entity:在“select”部分中使用Contains会引发意外错误

c# entity-framework linq-to-entities

我有一个针对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()上调用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;


许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因