";无法创建[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()将Person
和Dish
表拉入内存,它工作得很好,因此:
var q = from d in db.Dishes.ToList()
from p in db.People.ToList()
...
但是,当我感兴趣的只是每个表的ID和Name字段时,将两个完整的表加载到内存中是非常浪费的。
那么,如何在单个查询中实现这种交叉联接呢?
对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
};
哇!英孚很高兴,交叉加盟毫无怨言地回来了。