我需要修改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表中也称为状态)是我添加的字段。 有没有人对我如何做到这一点有任何建议?可能包括? 提前谢谢。
答案 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