“无法创建[MyClass]类型的常量值。在此上下文中仅支持基本类型。”

时间:2014-09-08 12:53:50

标签: c# entity-framework-5

我挣扎了几个小时才找到解决方案。我发布的是一个问题和答案,以帮助那些可能追随我的人。

我想在两个表之间进行交叉连接。为了演示目的,假设我想打印一个人和菜的矩阵,所以我可以填写每个人喜欢每种食物的数量

var q = from p in db.People
        from d in db.Dishes
        select new 
        {
          PersonID = p.ID,
          PersonName = p.Name,
          DishID = d.ID,
          DishName = d.Name
        };

但是当我执行此查询时,我得到了一个例外:

  

无法创建“MyDomain.Dish”类型的常量值。在此上下文中仅支持原始类型或枚举类型。

我搜索了所有对此错误的引用,并发现了很多对Contains()条件的引用...但我的查询中没有任何Contains()条件。

我尝试颠倒表格的顺序:

var q = from d in db.Dishes
        from p in db.People
        ...

错误也被逆转了!

  

无法创建“MyDomain.Person”类型的常量值。在此上下文中仅支持原始类型或枚举类型。

更重要的是,我发现如果我首先使用.ToList()将PersonDish表拉入内存,它就可以正常工作,因此:

var q = from d in db.Dishes.ToList()
        from p in db.People.ToList()
        ...

但将两个完整的表加载到内存中是非常浪费的,当我感兴趣的是每个表的ID和Name字段时。

那么如何在单个查询中使这个交叉连接工作​​?

1 个答案:

答案 0 :(得分:3)

Contains()条件的多次引用让我觉得第一张桌子试图做某个"包含"在第二个。因此,我没有进行交叉连接,而是在一个普遍真实的条件下进行内连接:

var q = from p in db.People
        join d in db.Dishes on 1 equals 1
        select new 
        {
          PersonID = p.ID,
          PersonName = p.Name,
          DishID = d.ID,
          DishName = d.Name
        };

瞧! EF很高兴,交叉加入回来时没有任何抱怨。