我挣扎了几个小时才找到解决方案。我发布的是一个问题和答案,以帮助那些可能追随我的人。
我想在两个表之间进行交叉连接。为了演示目的,假设我想打印一个人和菜的矩阵,所以我可以填写每个人喜欢每种食物的数量
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字段时。
那么如何在单个查询中使这个交叉连接工作?
答案 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很高兴,交叉加入回来时没有任何抱怨。