Entity framework EF无法识别“Boolean Contains(System.Object)”方法,此方法无法转换为存储表达式
我试图根据ID列表从数据库中获取对象,但我得到了错误 LINQ to Entities无法识别“Boolean ContainsSystem.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
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();