[英]How to get properties in LINQ after group by clause?
我正在用group by子句編寫一個linq查詢。 我無法從一個表中檢索屬性。 我的uploadTable結構如下
upld_docid upld_clientid upld_employeeid
1002 1008 1111
My UploadLogTable
upld_docid Label value Commited UpdatedBy
1002 Docnumber 123 False Niranjan
1002 ExpiryDate 01/01/2017 False Niranjan
1002 Docnumber 456 True Azeeza
1002 ExpiryDate 01/01/2019 True Azeeza
I am expecting output as
upld_clientid upld_employeeid Lable oldvalue newValue UpdatedBy
1008 1111 Docnumber 123 456 Azeeza
1008 1111 ExpiryDate 01/01/2017 01/01/2019 Azeeza
我已經寫了Linq查詢,並且我正在將所有字段都期望updatedby字段,因為我將所有內容分組,但是Updatedby字段包含不同的值。
var logDetails = (from c in db.ts_upldlog_content
join tbl in db.ts_upld_doc on c.upld_docid equals tbl.upld_docid
join doc in db.tm_doc_type on tbl.upld_doctypeid equals doc.doc_typeid
where (c.commited == false || c.commited == true)
&& (tbl.upld_clientid == clientId || tbl.upld_employeeid == employeeID || tbl.upld_empcitizenid == citizenId)
group c by new { c.upld_docid, c.upld_contentlabel, tbl.upld_clientname,tbl.upld_clientid,tbl.upld_employeeid} into grouping
select new logDetails
{
CId=grouping.Key.upld_clientid.Value,
employeeID=grouping.Key.upld_employeeid,
contentLabel = grouping.Key.upld_contentlabel,
upld_id = grouping.Key.upld_docid,
UpdatedBy=? //Here I am not sure how to get updatedby
oldValue = grouping.FirstOrDefault(x => x.commited == false).upld_contentvalue,
newValue = grouping.FirstOrDefault(x => x.commited == true).upld_contentvalue,
});
return logDetails.ToList();
我可以知道如何在上面的查詢中獲取UpdatedBy屬性嗎? 任何幫助,將不勝感激。 謝謝。
在select
之前和group by
之后使用let
關鍵字來創建一個變量,該變量包含與new data
和old data
相關的記錄:
var logDetails = (from c in db.ts_upldlog_content
join tbl in db.ts_upld_doc on c.upld_docid equals tbl.upld_doci
join doc in db.tm_doc_type on tbl.upld_doctypeid equals doc.doc_typeid
where (c.commited == false || c.commited == true) &&
(tbl.upld_clientid == clientId || tbl.upld_employeeid == employeeID || tbl.upld_empcitizenid == citizenId)
group c by new { c.upld_docid, c.upld_contentlabel, tbl.upld_clientname,tbl.upld_clientid,tbl.upld_employeeid } into grouping
let OldValue = grouping.FirstOrDefault(x => x.commited == false)
let NewValue = grouping.FirstOrDefault(x => x.commited == true)
select new logDetails
{
CId=grouping.Key.upld_clientid.Value,
employeeID=grouping.Key.upld_employeeid,
contentLabel = grouping.Key.upld_contentlabel,
upld_id = grouping.Key.upld_docid,
UpdatedBy = NewValue.updated_by
oldValue = OldValue.upld_contentvalue,
newValue = NewValue.upld_contentvalue,
}).ToList();
換句話說,如果您的數據可以包含,則對於group-by列,只有1個commited
記錄等於true
而1等於false
,並且true
定義了所有索引,這將是選擇一種“類型”的記錄( commited == true
那些),然后與另一個“類型” commited == true
。
var upld_content_view = from c in db.ts_upldlog_content
join tbl in db.ts_upld_doc on c.upld_docid equals tbl.upld_docid
join doc in db.tm_doc_type on tbl.upld_doctypeid equals doc.doc_typeid
select new { c, tbl, doc };
var result = (from u1 in upld_content_view
where u1.commited == true &&
(tbl.upld_clientid == clientId || tbl.upld_employeeid == employeeID || tbl.upld_empcitizenid == citizenId)
join u2 in upld_content_view.Where(item => item.commited == false)
on new { u1.upld_docid, u1.upld_contentlabel } equals new { u2.upld_docid, u2.upld_contentlabel }
select new logDetails
{
CId = u1.upld_clientid.Value,
employeeID = u1.upld_employeeid,
contentLabel = u1..upld_contentlabel,
upld_id = u1.upld_docid,
UpdatedBy = u1.updated_by // u1 represents the data of the NewValue
oldValue = u2.upld_contentvalue,
newValue = u1.upld_contentvalue,
}).ToList();
這樣,您就可以清楚地知道u1
的記錄代表共享數據和想要與NewValue
關聯的數據,而u2
代表與OldValue
關聯的數據。
如果第二種方法的假設是正確的,則應該測試兩種方法的性能,並檢查生成的sql和數據庫的執行計划是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.