EF无法识别方法'Boolean Contains(System.Object)'方法,并且此方法无法转换为商店表达式

时间:2016-04-13 19:34:35

标签: entity-framework linq

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

  

LINQ to Entities无法识别方法'Boolean Contains(System.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();

3 个答案:

答案 0 :(得分:0)

如果我很清楚您的问题,那么您正在尝试查找给定类别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);

答案 1 :(得分:0)

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,则会解析为Enumerable.Contains<T>,其中EF具有内置翻译路径。仅当T是基本类型时。这就是为什么你不应该选择匿名类型的原因。

答案 2 :(得分:0)

这与您使用ArrayList的事实有关,您不能这样做:

`

var list = q.ToList()

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

`

我不是EF专家,但我怀疑只包含泛型 集合