c# - LINQドロップ結果

c# linq linq-to-sql .net-3.5

複雑な(むしろハックな)動的SQLクエリをLINQクエリに変換しようとしています。

これまでに次のLINQクエリがあります。

var results = (
    from c in Customers
    from d in MonthCalendar
        join f in Facilities on c.CustomerCode equals f.CustomerCode
        join p in ProjectedCashFlows on f.FacilityId equals p.FacilityId into pj
                from p in pj.DefaultIfEmpty()                      
        where d.ExpectedYear == currentYear 
                && f.FacilityStatusId == 1
                && (p.ExpectedYear == null || d.ExpectedYear == p.ExpectedYear)
                && (p.ExpectedMonth == null || d.ExpectedMonth == p.ExpectedMonth)
                && c.PrimaryArmId == userId 
                && (p.ProjectedCashFlowStatusId == null || p.ProjectedCashFlowStatusId != 4)
        select new 
            {
                CustomerCode = c.CustomerCode,
                CustomerName = c.CustomerName,
                FacilityId = f.FacilityId,
                FacilityDescription = f.FacilityProductDescription,
                FacilityCurrency = f.FacilityCurrencyId,
                FacilityLimit = f.Limit,
                ExpectedYear = d.ExpectedYear,
                ExpectedMonth = d.ExpectedMonth,
                ExpectedAmount = p == null ? 0 : (double)p.ExpectedAmount

            }
            );


Customerテーブルと1対多の関係を持つFacilitiesテーブルから詳細を取得しようとしています。次に、ProjectedCashFlowsにある詳細を取得しようとしています

私が抱えている問題は、Customerテーブルに値が存在するかどうかに関係なく、クエリがすべてのFacilitesおよびProjectedCashFlows情報を返す必要があることです。

残念ながら、このクエリはそれを実行していません-ファシリティがCustomerテーブルに存在する場合にのみFacilitiesおよびProjectedCashFlows情報を返します。

MonthCalenderテーブルを使用して、年の各月をリストしました。

関連するテーブル情報は次のとおりです。

お客さま


CustomerCode
顧客名
PrimaryArmId


施設紹介


CustomerCode
FacilityId
FacilityCurrencyId
FaciliyLimit
施設の説明


ProjectedCashFlows


CustomerCode
FacilityId
ExpectedYear
ExpectedMonth
ExpectedAmount
ProjectedCashFlowStatusId


月カレンダー


ExpectedMonth
ExpectedYear


例として、Facilitiesテーブルに4行ある顧客がいますが、これらの施設のうち2つはProjectedCashFlowsテーブルに表示されないため、表示されていません。

エントリがProjectedCashFlowsに存在しない場合は、CalendarMonthsテーブルからExpectedMonth&ExpectedYearを取得し、ExpectedAmountに0を返し、FacilitiesテーブルのFacilityIdを使用する必要があります。

あなたはおそらくうまくいくので、私はLINQを使い始めたばかりです。

誰かが私を正しい方向に向けることができますか?
答え
クエリでは、nullでないと想定してpを使用します。

where d.ExpectedYear == currentYear 
      && f.FacilityStatusId == 1
      && (p.ExpectedYear == null || d.ExpectedYear == p.ExpectedYear)
      // etc


ただし、ProjectedCashFlowsがない場合に単一のnull値を持つシーケンスを論理的に作成するDefaultIfEmpty()を使用しました。

したがって、基本的には次のようなものが必要です。

where d.ExpectedYear == currentYear 
      && f.FacilityStatusId == 1
      && (p == null ||
          ((p.ExpectedYear == null || d.ExpectedYear == p.ExpectedYear)
          // etc
          ))
関連記事

c# - エラー1054-サービスがタイムリーに応答しませんでした-C#アプリケーション

c# - Visual Studio 2010でフィルタープログラムをデバッグするにはどうすればよいですか?

c# - ASP.Net MVC3モデルバインディングIEnumerable <T>とエディターテンプレート[重複]

c# - C#では、ローカルスコープを持つオブジェクトはスタックを使用しますか?

c# - リストビューは更新時に変更されません

c# - JavaリストXMLをC#にインポートする方法

c# - C#ファイルストリームをEXEファイルに渡す

c# - インターフェイスでイベントハンドラーを宣言する方法

c# - C#:SessiosnStateモードSqlServerで使用するためにデータセットをシリアル化可能にする

c# - 特定のアセンブリからの未処理の例外のみを処理する