簡體   English   中英

LINQ(C#)聯接-在單行中顯示重復的數據

[英]LINQ (C#) Join - Displaying duplicated data in single row

我是LINQ的新手。 我試圖加入一個表並查看並在數據表中顯示結果。

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

我的要求是在DataTable的UI上顯示如下,如下所示: 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查詢..預先謝謝。

因此,您要在匹配的SurrogateId上組合Request表和DemoView表,並希望將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,
    });

下面正在工作,請嘗試一下。

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。 只需一次收集列表對象並在查詢中使用該列表。 這樣就可以保存多數據庫調用。

我想出了以下查詢,它運行良好:

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}

我已經根據自己的需求故意使用了.Contains()。 .quals()會很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM