私の質問は、左外部結合を実行する方法ですが、linqToEF/SQL で日時フィールドに基づいて欠損値を含める方法です。特定の質問をするために大きな問題を切り詰めようとしています。
私は3つのテーブルを持っています。以下にそれらを描いてください。
- タイムログ | Id、StartDateTime、AccountNumber、ContractNumber
- 契約 | Id、ContractNumber、AccountNumber、Value、StartDateTime、EndDateTime
- アカウント | Id、AccountNumber、AccountName、Eメール、FirstName、LastName
次のようにlinqでgroup byを実行しています:
group new {contracts, timelogs} by new { accounts.AccountNumber, accounts.AccountName, Year = timelogs.StartDateTime.Year, Month = timelogs.StartDateTime.Month } into g
タイムログ テーブルには、特定のアカウントで 1 か月間送信されたタイムログのみが含まれます。タイムログが送信されていない場合、予想どおり、エントリは出力されません。
次の例を参照してください。
アカウント「Blah」には、月 5 のタイムログが送信されていません。したがって、以下のサンプル出力で Blah のエントリが欠落しています。
AccountName | Account Number | Month | Year
Bling 654321 5 2013
Bling 654321 6 2013
Blah 123456 6 2013
Bling 654321 7 2013
Blah 123456 7 2013
Bling 654321 8 2013
Blah 123456 8 2013
私はこれをやろうとしましたが、残念ながら、配列がローカルであるため、これは機能しません。
join months in new int[] { 1,2,3,4,5,6,7,8,9,10,11,12 } on timelogs.StartDateTime.Month equals months
join years in new int[] { 2008,2009,2010,2011,2012,2013,2014,2015,2016 } on timelogs.StartDateTime.Year equals months
DateTime フィールドから欠落している月/年に基づいて、linq から SQL/エンティティ フレームワークへの結合を実行するにはどうすればよいですか? タイムログがなくても、5 か月目の Blah を含めたいと思います。