Entity framework EF无法识别“Boolean Contains(System.Object)”方法,此方法无法转换为存储表达式

Entity framework EF无法识别“Boolean Contains(System.Object)”方法,此方法无法转换为存储表达式,entity-framework,linq,Entity Framework,Linq,我试图根据ID列表从数据库中获取对象,但我得到了错误 LINQ to Entities无法识别“Boolean ContainsSystem.Object”方法,此方法无法转换为存储表达式 这是我的密码 shopingEntities db = new shopingEntities(); var q = (from a in db.CatSetups join b in db.CatofCats

我试图根据ID列表从数据库中获取对象,但我得到了错误

LINQ to Entities无法识别“Boolean ContainsSystem.Object”方法,此方法无法转换为存储表达式

这是我的密码

       shopingEntities db = new shopingEntities();
      var q = (from a in db.CatSetups
                     join b in db.CatofCats
                     on a.CatId equals b.ParentCatID
                     where a.CatId == 1

                     select new
                     {



               // ID        b.ChildCat




                     });

      ArrayList list = new ArrayList(q.ToList());
      var ok = (from cc in db.CatSetups
                where list.Contains(cc.CatId)
                select cc).ToList();

如果我很了解您的问题,那么您正在尝试为给定的类别Id查找子类别

var childCats=from a in db.CatSetups
               join b in db.CatofCats on a.CatId equals b.ParentCatID
               where a.CatId == 1
               select  b.ChildCat;//Assuming ChildCat is an integer

var cats=db.CatSetups.Where(c=>childCats.Contains(c.CatId)).ToList();
如果CatofCats是多对多关系中的连接表,并且您使用的是导航属性:

public class CatofCats
{
    public int ParentCatID{get;set;}

    public int ChildCatID{get;set;}

    public virtual CatSetups ParentCat{get;set;}
    public virtual CatSetups ChildCat{get;set;}
}
那么您的查询将是:

var childCats=db.CatofCats.Where(c=>c.ParentCatID==1).Select(c=>ChildCat);

ArrayList.Contains根本没有翻译。但你不需要这样做。只需使用:

var q = from a in db.CatSetups
        join b in db.CatofCats
        on a.CatId equals b.ParentCatID
        where a.CatId == 1
        select b.ChildCat;

var list = q.ToList();
现在,如果使用Contains,它将解析为,EF有一个内置的转换路径。但仅当T是基元类型时。这就是为什么不应该选择匿名类型。

替换

ArrayList list = new ArrayList(q.ToList());


EF中未实现非泛型ArrayList中的方法。最肯定的是。

这与您正在使用ArrayList这一事实有关。您不能只执行以下操作:

`

`

我不是EF专家,但我怀疑它只支持泛型
集合

根据当前代码,q是空的匿名类型?您在第一次查询中选择了什么属性?我强烈建议您停止使用ArrayList。除非你正在与已有多年历史的图书馆进行交互,否则就没有必要使用它。即使这样,我也会在其他地方使用List,并将其复制到ArrayList中。也许它应该是b.ChildCat.CatId或b.ChildCatId之类的东西。它正在工作!非常感谢octavioccl:我实际上是Linq的新手。我认为像int[]id这样的id数组比var id要轻得多。。。。当您使用int数组作为id时,使用var list将很轻松
var list = q.ToList();
var list = q.ToList()

var ok = (from cc in db.CatSetups
                where list.Contains(cc.CatId)
                select cc).ToList();