【问题标题】:Linq to entities outer join, then an inner joinLinq 到实体外连接,然后是内连接
【发布时间】:2012-11-14 14:57:31
【问题描述】:

我有这个代码:

var query = (from p in dc.GetTable<Person>()
join pa in dc.GetTable<PersonAddress>() on p.Id equals pa.PersonId into tempAddresses
from addresses in tempAddresses.DefaultIfEmpty()
select new { p.FirstName, p.LastName, addresses.State });

这很好用,作为具有(可选)地址的人的外部连接。

现在我想通过内部连接将地址类型加入到这个查询中,因为每个地址都只有一个地址类型。 所以对于每个人,获取地址,如果有地址,也获取地址类型。

所以我创建了这个(将内部连接添加到地址类型):

var query = (from p in dc.GetTable<Person>()
join pa in dc.GetTable<PersonAddress>() on p.Id equals pa.PersonId into tempAddresses
from addresses in tempAddresses.DefaultIfEmpty()
join at in dc.GetTable<AddressTypes>() on pa.addresstypeid equals at.addresstypeid
select new { p.FirstName, p.LastName, addresses.State, at.addresstype }); 

现在当这个人没有地址时,我在 pa.addresstypeid 上得到一个空引用错误......

有没有办法在 linq 中创建它?

上述代码的行为与我的代码完全相同,但我的代码具有不同的实体,但我不允许显示实际代码...

编辑:

这是我的代码中实际有效的示例:(将表格替换为 foo/bar)

from foo in foos
join bar in new barRepository(SessionTicket).GetList()
    on foo.barId equals bar.barId
join barpersonbar in new barPersonbarRepository(SessionTicket,personId).GetList().Where(z=>z.PersonId == personid)
    on bar.barId equals barpersonbar.barId
    into outerbarpersonbar
from barpersonbar in outerbarpersonbar.DefaultIfEmpty()

这不是和你的评论一样,'pa'超出范围,这不是这段代码中的'bar'

【问题讨论】:

  • 我很惊讶,即使编译 - 你不应该在后面的代码中使用 addresses 而不是 pa 吗? pa 不再在范围内。
  • 我已经编辑了问题

标签: linq linq-to-entities


【解决方案1】:

使用into后,pa 不在作用域内

改变

on pa.addresstypeid equals

on addresses.addresstypeid equals

【讨论】:

  • 这大概意味着原始代码不准确 - 它并没有真正回答问题。
  • @JonSkeet - 好点。随着问题的发展,我会改进我的答案
猜你喜欢
  • 2011-09-04
  • 2010-12-03
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
相关资源
最近更新 更多