我有一个针对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重载。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top