2009-03-02 18 views
1

LINQToSQLからの左外部結合を変換して、一意の親行を返すことができません。左外側結合し、Linq To SQL C#.NET 3.5に存在

私は2つのテーブルを持っています(Project、Project_Notes、そしてProject_IDによってリンクされた1-manyの関係です)。 2つのテーブルの複数の列でキーワード検索を実行していますが、Project_Notesの列にキーワードが含まれている場合にのみ、固有のプロジェクトを返したいとします。私はこのlinqtoSQlシーケンスを行っているが、それは複数のプロジェクトの行を返すようだ。何とかLINQでExistを実行していますか?または、何らかのグループの人ですか?ここで

はLINQToSQLです:

query = from p in query 
join n in notes on p.PROJECT_ID equals n.PROJECT_ID into projectnotes 
from n in notes.DefaultIfEmpty() 
where n.NOTES.Contains(cwForm.search1Form) 
select p; 

ここでは、プロファイラから生成SQLだ

幹部sp_executesqlをN'SELECT [T2] [タイトル]、[T2] [状態]、[。。 t2] [都市名]、[t2]。[アップロードされた日付]、 [t2]。[提出日]、[ t2]。[タイトル]、[t0]。[状態]、[t0]。[Project_Type] FROM(ROW_NUMBER、[t0]。 [PROJECT_ID]、 [T0]。[PROVIDER_ID]、[T 0] [CATEGORY_ID]、[T 0] [シティ]、[T 0] [UploadedDate]、 [T0]。[SubmittedDate]、[T 0] [Project_Type] FROM [DBO]。[PROJECTS] AS [T0] LEFT OUTERは [DBO]をJOIN [PROJECT_NOTES] = 1 WHERE([T1]。@ P0 LIKE [NOTES])AND ([T 0] ON [T1] AS。 SubmittedDate]> = @ P1)と([T 0] [SubmittedDate】P2 @ <)AND([T 0] [PROVIDER_ID] = @ P3)AND([T 0]は[CATEGORY_ID] NULL))AS [T2と]ここで、[T2]。[ROW_NUMBER] BETWEEN @ P4 + 1 AND @ P4 + @ P5 BY ORDER [T2]。[ROW_NUMBER] 'N' @ P0はVARCHAR(9)、@ P1日時、@ P2日時、@ @ p2 = '' 2009-03 p3 int、@ p4 int、@ p5 int '、@ p0 ='%シカゴ% '、@ p1 =' '2000-09-02 00:00:00:000' '、@ p2 =' '' -02 00:00:00:000 ''、@ P3 = 1000、@ P4 = 373620、@ P5 = 20

このクエリは、結果に1対多の関係のすべてのmutiplesを返します。ここからLINQでExistsを実行する方法が見つかりました。

query = from p in query 
where (from n in notes 
where n.NOTES.Contains(cwForm.search1Form) 
select n.PROJECT_ID).Contains(p.PROJECT_ID) 
select p; 

生成されたSQL文:ここhttp://www.linq-to-sql.com/linq-to-sql/t-sql-to-linq-upgrade/linq-exists/

Existsを使用してLINQToSQLある。

のexec sp_executesqlをN'SELECTのCOUNT(*)[値]と[DBO]の[プロジェクト([t1] .PROJECT_ID] =([t0]。[PROJECT_ID]))AND([PROJECT_ID])と[(PROJECT_ID) [t1]。[NOTES] LIKE @ p0))AND ([t0]。[SubmittedDate]> = @ p1)AND([t0]。[Su bmittedDate] < @ P2)AND([T 0] [PROVIDER_ID] = @ P3)AND([T 0]が[CATEGORY_ID]がNULL) 'N' @ P0はVARCHAR(9)、@ P1日時、@ P2日時@ p2 = ''、@ p2 = ''、@ p2 = ''、@ p2 = ''、@ p3 =00:00 :00:000 ''、@ P3 = 1000

私はdatabind()からExistsを使用してから、SQLタイムアウトを取得します。

+0

明らかにスキップから来た生成されたSQLを表示乗り、そしてカウントし、やや安っぽくある - そしてその後、スキップ、私たちが表示されません、テイク、カウント。 –

+0

すべてがGridviewコントロールによって生成されます。データをバインドするので、カスタムページングを行う必要はありませんでした。 – stevenjmyu

答えて

5

はい、それは作品に参加する方法を説明します複数のプロジェクト行

を返しているように見えます。プロジェクトに5つの一致するノートがある場合、それは5回表示されます。


問題が発生した場合はどうなりますか?「結合」は間違ったイディオムです。

あなたは、そのノート特定のテキストが含まれているものにプロジェクトをフィルタリングする:

var query = db.Project 
    .Where(p => p.Notes.Any(n => n.NoteField.Contains(searchString))); 
関連する問題