簡體   English   中英

分組子句后如何在LINQ中獲取屬性?

[英]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 dataold 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.

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