2011-08-10 17 views
0

これはかなりシンプルですが、私はこれを念頭に置くことができません。類似したクエリを考える:Linqとリポジトリパターン - 適用方法がわからない結合メソッド

SELECT * FROM Client 
LEFT JOIN DriverClient ON DriverClient.ClientID = Client.ClientID 
WHERE Client.FullName LIKE '%Tooley%' 
AND (DriverClient.DriverID IS NULL OR DriverClient.DriverID <> 1) 

とリポジトリパターン、はどのように私はこれを近似するだろうLINQの中で何かを実装するのでしょうか?

私はLIKEを考え出しました。それはDriverClient.DriverIDのフィルタです。わかりません。これには明らかにIEnumerable<T>.Joinが含まれていますが、このための構文が私を逃してしまい、良い例ではありません。誰もLinq Query構文を使用しているようです。または、IQueryableではありません。

+0

これまでのコードを表示してください。 –

答えて

0

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

var Client = new[] { new { ClientID = 1, FullName = "Name1" }, new { ClientID = 2, FullName = "Name2_Tooley_3242343" } }; 
var DriverClient = new[] { new { ClientID = 2, DriverID = 20 }, new { ClientID = 3, DriverID = 30 } }; 

var result = 
    from client in Client 
    join driver in DriverClient on client.ClientID equals driver.ClientID into ClientDriver 
    from clientDriver in ClientDriver.DefaultIfEmpty() 
    where client.FullName.Contains("Tooley") && (clientDriver == null || clientDriver.DriverID != 1) 
    select client; 

UPDATE

var result2 = Client 
    .GroupJoin(DriverClient, client => client.ClientID, driver => driver.ClientID, (client, drivers) => new { client, drivers }) 
    .Where(clientDrivers => clientDrivers.client.FullName.Contains("Tooley") && clientDrivers.drivers.Count(driver => driver.DriverID != 1) > 0); 
+0

ここで私が本当に探しているのは、クエリ構文ではなくメソッド拡張構文でこれを行う方法です。このプロジェクトで使用されているリポジトリパターンのため、クエリ構文は多くの労力を要することなく機能しません。 – lamont

+1

これは意味がありません。なぜなら、クエリ構文は拡張メソッド構文と同等であるからです。 – Stilgar

2

Whil LINQには通常は必要ないはずの結合構造があります。リレーショナルデータベースのJOINで照会される関係には、OOプログラミングにおけるプロパティ(単一オブジェクトまたはコレクションのいずれか)が提示されます。 DriverClient.Clientsやその他のマッピングを使用して、結合の代わりにこれを使用する必要があります。

0

データベース構造を知らなくても、その一部は推測です。

DriverClientは単純なリンクテーブルですよね?列をDriverIDClientIDとし、ドライバをクライアントにリンクするためだけに使用しますか?それはあなたが* -to-多くの関係を持っている意味と仮定すると、(1つのドライバは、多くのクライアントを持ち、合理的なようだ)あなたは、おそらくこのような何かを探している:一般的に

var result = DB.Clients 
    .Where(c => c.FullName.Contains("Tooley") 
     && (c.DriverID == null || c.DriverId != 1)); 

、LINQの詳細を隠そうとします結合と物事の代わりに、ナビゲーションプロパティのようなものが得られます。

0

ここで重要なのは、コンテキストをどのように処理しているかです。各 "クライアント"が自分のリポジトリ内のコンテキストを管理している場合、コンテキスト間での結合はできません。しかし、すべてのリポジトリがDIを介して同じ基本コンテキストを使用する場合、リポジトリからIEnumerable/IList/etcではなくIQueryableとしてオブジェクトを公開している限り、クエリまたはラムダ構文を使用してそれらに参加できます。

関連する問題