2016-11-29 4 views
0

私はLINQを初めて使用しています。 テーブルに参加して結果を表示し、データテーブルに表示しようとしています。LINQ(C#)Join - 重複したデータを1行に表示

私のシナリオ(データベース)を考えてみましょう: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クエリを教えてくれますか? ありがとうございます。

+0

左結合を使用する必要はありません。結合のみを使用します。デフォルトでは、linqはこれを内部結合とみなし、内部結合のみでこれを達成できます。これを参照してくださいhttp://stackoverflow.com/questions/3217669/how-to-do-a-join-in-linq-to-sql-with-method-syntax – Bharat

+0

試してみてください。しかし、それはすべての行を返すわけではありません。私の問題はサブクエリ+ジョインが必要だと思う。 –

+0

これは* pivoting *と呼ばれ、それについて多くの質問があります。多分あなたはあなたに合ったものを見つけることができます。 –

答えて

0

私は次のクエリを思い付いた、それが完璧に動作します:

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を使用していた)目的に私の要件ごとに。 .Equals()はうまくいくでしょう。

0

したがって、RequestテーブルとDemoViewテーブルを一致するSurrogateIdに結合し、結果として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, 
    }); 
+0

@Harald Coppoolseの返信をありがとう。あなたが提供した解決策はMethod構文です。私はそれをクエリ構文で変換しようとしましたが、私は途中で止まってしまいました。しかし、私は、次の部分が正しいと確信している:request.SurrogateIdにDB.DemoViewでAPPRに参加** 'VARクエリ= DB.Request \tでリクエストから にappr.SurrogateIdに等しい新しいのSearchResultに { }' *を選択* –

+0

クエリの構文はどのように見えますか? –

0

それを試してみてください。

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複数の時間を使用しないでください。リストオブジェクトを一度収集し、そのリストをクエリで使用します。したがって、複数のデータベース呼び出しが保存されます。

+1

答え@ J-Meanをありがとう。私が間違っていない場合は、DemoVIewを次のようにリスト文字列に変換する必要があります。リスト lstDemoView = DB.DemoView.ToList()そうでなければ、エラーをスローします。 –

+0

私のクエリで複数のDB呼び出しの問題を指摘してくれてありがとう。ただ1つのヘルプ - 私が書いたようにクエリがどのように見えるか(つまり複数のDB呼び出し)を提供することができます。 –

+0

申し訳ありませんが、あなたの最後のコメントはありませんでした。説明してください。 –

関連する問題