[英]LINQ (C#) Join - Displaying duplicated data in single row
我是LINQ的新手。 我試圖加入一個表並查看並在數據表中顯示結果。
考慮我的情況(數據庫):
我的要求是在DataTable的UI上顯示如下,如下所示:
我嘗試了以下左外連接(示例代碼):
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.