2016-10-18 12 views
0

私はgroup by節を使って1つのlinqクエリを書いています。 1つのテーブルからプロパティを取得できません。 私はLINQクエリを書かれていると私はUpdatedbyフィールドは異なる値が含まれていますが、私はすべてをグループ化していますので、すべてのフィールドがupdatedbyフィールドを期待して取得していますgroup by節の後にLINQのプロパティを取得する方法は?

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 

を次のように私のuploadTable構造があります。

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プロパティを取得する方法を知っていますか?どんな助けもありがとう。ありがとう。

答えて

1

new dataに関連するレコードを含む変数を作成するためにselect前とgroup by後、letキーワードを使用して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(); 

もう一つの方法は、あなたのデータを含めることができる場合は、あなたのためにグループ単位の列のうち、trueと1〜falseに等しいcommitedのレコードが1つしかなく、定義されたすべてのインデックスがレコードの1つのタイプ(「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のレコードが共有データを表し、u2OldValueに関連付けられたデータのためである間、あなたがそれをしたいデータがNewValueに関連付けられていることを知っているexaclyこの方法では。

第2の方法の前提が正しい場合は、両方の方法でパフォーマンスがテストされ、生成されたSQL +データベースの実行計画が確認されます。

+1

チャームのように働いた。私は自由時間を取るとLINQを勉強したいと思っています。あなたのチュートリアルをありがとう。その本当に役に立つ。 –

+0

@NiranjanGodbole - あなたは歓迎です –

関連する問題