我试图在我的代码中使用以下LINQ to SQL:
(from s in dc.Accounts
join purchases in dc.Transactions on s.AccID equals purchases.Account into pu
join pop in dc.POPTransactions on new { s.ID, syncNo } equals new {AccId = pop.AccountID, SyncNo = pop.SyncNo } into po
where s.AccID == ID && s.Customer == false
select new AccsandPurchase { acc = s, purchases = pu.ToList(), pop = po.ToList() } ));
错误发生在第二个连接行(上面整个查询中的第三行)-我曾经有过它,所以它只是在s.ID和pop上连接。AccountID并且工作得很好,但是现在我引入了另一个连接条件(syncno),我得到以下错误:
"中的一个表达式的类型连接子句不正确。类型的调用推理失败GroupJoin"
任何想法?一些笔记:
1: '变量'syncNo'是一个长,因为是在DB (bigint)的值。db中的值是可空的,所以我也尝试了"long?"作为变量类型
2: AccsandPurchase是我创建的一个自定义类,你可以猜到
谢谢
尝试指定相同的连接键名,例如
join pop in dc.POPTransactions on new { Key1 = s.ID, Key2 = syncNo } equals new {Key1 = pop.AccountID, Key2 = pop.SyncNo }
来自MSDN文档:
组合键的类型推断取决于键中属性的名称以及它们出现的顺序。如果源序列中的属性没有相同的名称,则必须在键中分配新名称。例如,如果Orders表和OrderDetails表各自为其列使用不同的名称,则可以通过在匿名类型中分配相同的名称来创建组合键:
join...on new {Name = o.CustomerName, ID = o.CustID} equals
new {Name = d.CustName, ID = d.CustID }
http://msdn.microsoft.com/en-us/library/bb907099.aspx 在比较不同类型的属性时也经常出现这个问题。例如将short类型与int类型进行比较,或将string类型与int类型进行比较,等等。名称必须匹配,但是当您的比较已经具有相同的名称并且无法找到问题时,请检查它们是否也具有相同的类型。
from p in DbSet.AsQueryable()
join t in _dbContext.SomeEntity on new { p.Id, Type = (int)MyEnum.Something }
equals new { t.Id, Type = t.EntityType}
在这个例子中,如果t.p entitytype是短,它正在与整数进行比较,它也会给你消息:
"连接子句中一个表达式的类型不正确。调用"GroupJoin"时类型推断失败"