2016-11-29 89 views
0

我是LINQ的新手。 我想加入一個表並查看並在數據表中顯示結果。LINQ(C#)加入 - 在單行顯示重複的數據

考慮我的情況(數據庫):1]

我的要求是,以顯示如下的數據表上的用戶界面如下:2]

我曾嘗試以下左外連接(示例代碼):`

var query = (

from request in DB.Request 
join financeaprv in DB.DemoView on request.SurrogateID equals financeaprv.SurrogateID into financeaprvList 
          from financeaprv in financeaprvList.DefaultIfEmpty() 
          where financeaprv.ApproverType=="Finance" 

    join sysadmin in DB.DemoView on request.SurrogateID equals sysadmin.SurrogateID into sysadminList 
          from sysadmin in legalaprvList.DefaultIfEmpty() 
          where sysadmin.ApproverType=="Admin" 

    select new queryResult        
    { 
     FinanceApprv = financeaprv.ApproverName 
     Admin = sysadmin.ApproverName 

    } 

`

但它是不成功的。 任何人都可以告訴我什麼是我的問題LINQ查詢.. 先謝謝您。

+0

您不需要使用左連接只使用連接,默認情況下,linq會將此視爲內連接,您只能通過內連接實現此功能。看到這個http://stackoverflow.com/questions/3217669/how-to-do-a-join-in-linq-to-sql-with-method-syntax – Bharat

+0

試過了。但它不會返回所有行。我認爲我的問題需要子查詢+連接。 –

+0

這被稱爲* pivoting *,並且有很多關於它的問題。也許你可以找到適合你的人。 –

回答

0

我想出了以下查詢,它的工作原理非常清楚:故意

var query = (from request in DB.Request let approvers = DB.DemoView.Where(sid => sid.SurrogateID == request.SurrogateID).Select(col => new { col.ApproverName, col.ApproverType}) select new queryResult{FinanceApprover = approvers.Where(state => state.ApproverType.Contains("Finance")).Select(name => name.ApproverName).FirstOrDefault(),//and so on} 

我已經使用了。載有()按我的要求。 .Equals()將會很好。

0

因此,您希望將Request表和DemoView表合併到SurrogateId中,並希望將列RequestId,SurrogateId,Finance,Manager和Admin作爲結果。

你的LINQ順序是:

Request.Join(DemoView,  // join the Request and DemoView tables 
    r => r.SurrogateId, // from each Request element take the SurrogateId 
    d => d.SurrogateId, // from each DemoView element that the SurrogateId 
    (req, dem) => new     // when they match, take the request element 
    {         // and the demoView element 
     RequestId = req.RequestId,  // and create a new object containing 
     SurrogateId = req.SurrogateId, // the mentioned properties 
     Finance = dem.Finance, 
     Manager = dem.Manager, 
     Admin = dem.Admin, 
    }); 
+0

感謝@Harald Coppoolse的回覆。您提供的解決方案是在方法語法中。我試圖在查詢語法中將其轉換,我半途卡住。但我敢肯定,下面的部分是正確的:**'VAR的查詢=從DB.Request要求 \t在DB.DemoView上request.SurrogateId加入APPR等於appr.SurrogateId到 選擇新的信息搜索結果 { }'* * –

+0

它在查詢語法中看起來如何? –

0

下面是工作,請嘗試。

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Request> lstRequest = new List<Request>(); 
     lstRequest.Add(new Request(1, 1)); 
     lstRequest.Add(new Request(2, 2)); 


     List<DemoView> lstDemoView = new List<DemoView>(); 
     lstDemoView.Add(new DemoView(1, "Ram", "Finance")); 
     lstDemoView.Add(new DemoView(1, "Sam", "Manager")); 
     lstDemoView.Add(new DemoView(1, "Dan", "Admin")); 
     lstDemoView.Add(new DemoView(2, "abc", "Finance")); 



     var query = (from request in lstRequest 
        select new 
        { 
         RequestID = request.RequestID, 
         SurrogateID = request.SurrogateID, 
         Finance = lstDemoView.Any(x => x.SurrogateID == request.SurrogateID && x.ApproverType.ToLower() == "finance") ? lstDemoView.SingleOrDefault(x => x.SurrogateID == request.SurrogateID && x.ApproverType.ToLower() == "finance").ApproverName : "", 
         Manager = lstDemoView.Any(x => x.SurrogateID == request.SurrogateID && x.ApproverType.ToLower() == "manager") ? lstDemoView.SingleOrDefault(x => x.SurrogateID == request.SurrogateID && x.ApproverType.ToLower() == "manager").ApproverName : "", 
         Admin = lstDemoView.Any(x => x.SurrogateID == request.SurrogateID && x.ApproverType.ToLower() == "admin") ? lstDemoView.SingleOrDefault(x => x.SurrogateID == request.SurrogateID && x.ApproverType.ToLower() == "admin").ApproverName : "" 
        }).ToList(); 
    } 
} 

public class Request 
{ 
    public int RequestID { get; set; } 
    public int SurrogateID { get; set; } 

    public Request(int RequestID, int SurrogateID) 
    { 
     this.RequestID = RequestID; 
     this.SurrogateID = SurrogateID; 
    } 

} 

public class DemoView 
{ 
    public int SurrogateID { get; set; } 
    public string ApproverName { get; set; } 
    public string ApproverType { get; set; } 

    public DemoView(int SurrogateID, string ApproverName, string ApproverType) 
    { 
     this.SurrogateID = SurrogateID; 
     this.ApproverName = ApproverName; 
     this.ApproverType = ApproverType; 
    } 
} 

注意: - 不要在查詢中多次使用DB.DemoView。只需一次收集列表對象並在查詢中使用該列表。因此保存多個數據庫調用。

+1

謝謝你的答案@ J-Mean。如果我沒有錯,我們必須將DemoVIew轉換爲列表字符串,如下所示:列表 lstDemoView = DB.DemoView.ToList()否則會引發錯誤。 –

+0

感謝您在我的查詢中指出多個數據庫調用的問題。只需一個幫助 - 您還可以提供查詢如何以我編寫的方式(即多個數據庫調用)進行查看。 –

+0

對不起,我沒有得到你最後的評論。請你解釋一下。 –