修改Linq查询以支持可选关系

时间:2014-03-18 04:06:28

标签: c# linq

我遇到linq查询问题,其中连接记录为空。

我有3个型号:

位置,公司和个人。

  • 某人必须在一家公司
  • 一个人可能只有一个位置
  • 公司可能有多人

我使用以下LINQ查询来检索特定公司所有人的所有位置的不同列表:

locations =
            db.Companies.Where(c => c.Name == company.Name)
            .SelectMany(c => c.People)
            .Select(p => p.Location)
            .Distinct()
            .ToList();

问题出现在从此查询中检索到的Peron没有位置(位置对于Person是可选的)。

在这种情况下,由于未将Object引用设置为对象,以下查询(获取每个位置的名称)将失败:

locations.Select(g => g.Name).ToList()

如何更改上述行以忽略已检索的人员记录中没有位置的记录?

2 个答案:

答案 0 :(得分:3)

试试这个:

locations =
            db.Companies.Where(c => c.Name == company.Name)
            .SelectMany(c => c.People)
            .Where(p => p.Location !=null)
            .Select(p => p.Location)
            .Distinct()
            .ToList();

干杯

答案 1 :(得分:2)

通常,您可以使用null合并或条件运算符来检查null,然后使用合适的默认值替换它,例如:

locations =
        db.Companies.Where(c => c.Name == company.Name)
        .SelectMany(c => c.People)
        .Select(p => p.Location ?? SomeDefaultLocation)
        .Distinct()
        .ToList();

e.g。 SomeDefaultLocation可以是readonly static的{​​{1}}个实例。

但是,在您提供的上下文中,这并没有多大意义(例如,所有没有位置的人都会返回Location)。这将是一个更典型的用法:

SomeDefaultLocation