LINQ to SQL加入问题

时间:2011-04-06 08:04:09

标签: c# linq linq-to-sql

我正在尝试在我的代码中使用以下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() } ));

错误发生在第二个连接线上(上面整个查询中的第3行) - 我曾经拥有它所以它刚刚加入了s.ID和pop.AccountID并且工作得很完美,但现在我引入了另一个连接标准(syncno)我收到以下错误:

  

“其中一个表达式的类型   join子句不正确。类型   推断失败了   '群组加入'“

有什么想法吗?一些说明:

1:'变量'syncNo'是一个long,就像DB(bigint)中的值一样。 db中的值是可以为空的,所以我也尝试过“long?”作为变量类型

2:AccsandPurchase是我制作的自定义课程,您可以猜测

由于

3 个答案:

答案 0 :(得分:21)

尝试指定相同的连接键名称,例如

join pop in dc.POPTransactions on new { Key1 = s.ID, Key2 = syncNo } equals new {Key1 = pop.AccountID, Key2 = pop.SyncNo }

答案 1 :(得分:5)

来自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

答案 2 :(得分:0)

当您同时比较不同类型的属性时,经常会出现此问题。例如将short与int进行比较,或将字符串与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.EntityType为 short (正在与整数进行比较),它还会向您显示消息:

  

“ join子句中的表达式之一的类型不正确。对'GroupJoin'的调用中类型推断失败”