2016-06-27 47 views
1

我需要修改linq查詢以包含來自外鍵相關表的值。 原來的查詢是:Linq查詢修改以在相關表中包含值

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

我有另一個表ObservationsScreening這是1 - 許多人的意見,並含有ObservationsGuid場。 我想在ObservationsScreening表中包含「Status」字段,但是如果ObservationScreening記錄沒有ObservationScreening記錄,我仍然想要返回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不包含狀態的定義,並沒有擴展方法 觀察報告觀測類別是:

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; } 
} 

不e有2個狀態。實際稱爲狀態的類中的一個指的是不同的字段,並且它正常工作。 TestResult(在ObservationScreening表中也稱爲狀態)是我要添加的字段。 有沒有人對我如何做到這一點有任何建議?包括也許? 在此先感謝。

+1

錯誤是說你的'DTO.ObservationReportObservation'類中根本沒有'Status'方法/屬性。也許你錯過了某些東西,或者這是一個語法錯誤,你的方法從例如小寫字母或類似的東西?您可以考慮共享該類的構造函數代碼,以便我們可以進一步幫助您。 –

+1

你能寫你的ObservationScreenings類嗎? – Kahbazi

+1

「* Observations Scoringing's 1-many to Observations **從我看到的情況來看,情況正好相反,所以'u.ObservationScreenings'是一個集合,它也被錯誤信息所指示。 –

回答

1

的幾點:

我有另一個表ObservationsScreening這是1 - 許多人觀察

縱觀導航屬性(u.ObservationScreenings)和錯誤消息的名稱,它應該是相反,即一個Observation可能有零或更多ObservationScreenings

我想包括從ObservationsScreening表中的字段「狀態」,但如果有一個觀察沒有ObservationsScreening紀錄,我還是想返回的數據觀察

所以,你正在尋找一個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