Linq查询修改以在相关表中包含值

时间:2016-06-27 18:01:41

标签: c# linq join include

我需要修改linq查询以包含外键相关表中的值。 原始查询是:

var query = from n in context.Observations
                        select n;

我有另一个表ObservationsScreening,它是1-many to Observations,包含一个ObservationsGuid字段。 我想在ObservationsScreening表中包含“Status”字段,但是如果没有ObservationsScreening记录,我仍然想要返回Observations的数据。 我尝试过使用这样的连接:

var query = from n in context.Observations join s in context.ObservationScreenings on n.GUID equals s.ObservationGuid
                        select n;

但是当我尝试填充我的DTO时,我无法获得我需要的价值:

SortablePaginatedList<DTO.ObservationReportObservation> results = new SortablePaginatedList<DTO.ObservationReportObservation>(query.Select(u => new DTO.ObservationReportObservation()
                 {
                     ObservationGuid = u.GUID,
                     CarrierName = u.CompanyName,
                     DOTNumber = u.DOTNumber,
                     KYUNumber = u.KYUNumber,
                     Status = u.Verified ? "Verified" : "Unverified",
                     TestResult = u.ObservationScreenings.Status,
                     ObservedBy = u.ObservedBy,
                     WeighStation = u.WeighStation.Name,
                     ObservedDate = u.ObservedDate,
                     VehiclePlateNumber = u.VehiclePlateNumber
                 }), Page, PageSize, SortBy, Ascending);

我收到一条消息“Sytem.Collections.Generic.Icollection不包含Status的定义,也没有扩展方法。 观察报告观察班是:

public class ObservationReportObservation
{
    public Guid ObservationGuid { get; set; }
    public string CarrierName { get; set; }
    public int? DOTNumber { get; set; }
    public string KYUNumber { get; set; }
    public string Status { get; set; }
    public string TestResult { get; set; }
    public string ObservedBy { get; set; }
    public string WeighStation { get; set; }
    public DateTime ObservedDate { get; set; }
    public string VehiclePlateNumber { get; set; }
}

请注意,有2种状态。实际上称为状态的类中的那个是指不同的字段,并且它正常工作。 TestResult(在ObservationScreening表中也称为状态)是我添加的字段。 有没有人对我如何做到这一点有任何建议?可能包括? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

几点:

  

我有另一张表ObservationsScreening,它是观察者的1-many

查看导航属性的名称(u.ObservationScreenings)和错误消息,它应该相反,即一个 Observation可能 0或更多 ObservationScreenings

  

我想在ObservationsScreening表中包含“Status”字段,但如果没有观察的ObservationsScreening记录,我仍然想要返回Observations的数据

所以你正在寻找一个Left Outer Join

  

我尝试过使用像这样的连接

如果您拥有导航属性,则无需使用手动联接。使用导航属性,EF将为您创建必要的连接。

基于以上所述,我认为你正在寻找类似的东西:

var query = 
    from o in context.Observations
    from s in u.ObservationScreenings.DefaultIfEmpty()
    select new DTO.ObservationReportObservation
    {
        ObservationGuid = o.GUID,
        CarrierName = o.CompanyName,
        DOTNumber = o.DOTNumber,
        KYUNumber = o.KYUNumber,
        Status = o.Verified ? "Verified" : "Unverified",
        TestResult = s.Status,
        ObservedBy = o.ObservedBy,
        WeighStation = o.WeighStation.Name,
        ObservedDate = o.ObservedDate,
        VehiclePlateNumber = o.VehiclePlateNumber
    };

var results = new SortablePaginatedList<DTO.ObservationReportObservation>(
    query, Page, PageSize, SortBy, Ascending);

请注意DefaultIfEmpty来电 - 这就是left outer join的原因。如果不包含该查询,查询将被翻译为inner join