";无法创建[MyClass]类型的常量值.在此上下文中仅支持基元类型&”;

本文关键字:类型 上下文 支持 quot 创建 常量 MyClass | 更新日期: 2023-09-27 18:20:59

我花了几个小时才找到解决方案。我张贴作为一个问题和答案的利益,其他人可能会来找我。

我想把两张桌子交叉连接起来。出于演示目的,假设我想打印一个人和菜的矩阵,这样我就可以填写每个人喜欢每种食物的程度

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字段时,将两个完整的表加载到内存中是非常浪费的。

那么,如何在单个查询中实现这种交叉联接呢?

";无法创建[MyClass]类型的常量值.在此上下文中仅支持基元类型&”;

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
        };

哇!英孚很高兴,交叉加盟毫无怨言地回来了。