2009-03-02 21 views
1

Benzersiz üst satırlar döndüren LINQToSQL'den bir sol dış birleştirmeyi çeviriyorum.Sol Dış Bağlan ve Var olan Linq için SQL C# .NET 3.5

2 tablom var (Project, Project_Notes ve Project_ID ile bağlantılı bir çok ilişki var). 2 tablosunda birden çok sütun üzerinde bir anahtar kelime araması yapıyorum ve yalnızca Project_Notes'ta bir anahtar kelime bir anahtar kelime içeriyorsa benzersiz projeleri döndürmek istiyorum. Bu linqtoSQl dizisine gidiyorum ama birden çok Project satırını döndürüyor gibi görünüyor. Belki bir LINK'de Exist mu? Ya da belki bir çeşit bir grup? İşte

LinqToSQL var:

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; 

burada profilcisine üretilen SQL var

exec Sp_executesql N'SELECT [t2] [Başlık], [t2] [Devlet], [.. t2]. [PROJECT_ID], [t2]. [PROVIDER_ID], [t2]. [CATEGORY_ID], [t2]. [Şehir], [t2]. [UploadedDate], [t2]. [Gönderilen Tarih], [ t2]. [Project_Type] FROM (SELECT ROW_NUMBER() ÜZERİNDEN ( [t0]. [UploadedDate] OR). [ROW_NUMBER], [t0]. [Başlık], [t0]. [Durum], [t0]. [PROJECT_ID], [t0]. [PROVIDER_ID], [t0]. [CATEGORY_ID], [t0]. [Şehir], [t0]. [YüklendiDurum], [t0]. [Gönderilen Tarih], [t0]. [Project_Type] FROM [PROJELER] [TEKLİF DIŞI BIRAKMA ORTAMI] [dbo]. [PROJECT_NOTES] AS [t1] AÇIK 1 = 1 NEREDE ([t1]. [NOTLAR] GİBİ @ p0) VE ([t0]. Gönderilen Tarih]> = @ p1) VE ([t0]. [Gönderilen Tarih] < @ p2) VE ([t0]. [PROVIDER_ID] = @ p3) VE ([t0]. [CATEGORY_ID] NULL IS) AS [t2 ] [R2_NUMBER] [ROW_NUMBER] BETWEEN @ p4 + 1 VE @ p4 + @ p5 SIRA GÖRE [t2]. [ROW_NUMBER] ', N' @ p0 varchar (9), @ p1 datetime, @ p2 datetime, @ p3 int, @ p4 int, @ p5 int ', @ p0 ='% chicago% ', @ p1 =' '2000-09-02 00: 00: 00: 000' ', @ p2 =' '2009-03 -02 00: 00: 00: 000 '', @ p3 = 1000, @ p4 = 373620, @ p5 = 20

Bu sorgu, sonuçlarda 1-çok ilişkinin tüm katkısını döndürür. Buradan LINQ'da bir Exists'un nasıl yapıldığını buldum. İşte

http://www.linq-to-sql.com/linq-to-sql/t-sql-to-linq-upgrade/linq-exists/ LinqToSQL Exists kullanıyor:

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; 

oluşturulan SQL deyimi:.

exec Sp_executesql N'SELECT COUNT (*) [dbo] DAN [değer] OLARAK [PROJELER ] AS [t0] NEREDE (EXISTS (SELECT NULL AS [BOŞ]] FROM [dbo]. [PROJECT_NOTES] AS [t1] NEREDE ([t1] .PROJECT_ID] = ([t0]. [PROJECT_ID])) VE ([t1]. [NOTLAR] LIKE @ p0))) VE ([t0]. [Gönderilen Tarih]> = @ p1) VE ([t0]. [Su bippedDate] < @ p2) VE ([t0]. [PROVIDER_ID] = @ p3) VE ([t0]. [CATEGORY_ID] NULL) ', N' @ p0 varchar (9), @ p1 datetime, @ p2 datetime , @ p3 int ', @ p0 ='% chicago% ', @ p1 =' '2000-09-02 00: 00: 00: 000' ', @ p2 =' '2009-03-02 00:00 : 00: 000 '', @ p3 = 1000

ben Exists kullanarak databind() bir SQL zaman aşımı olsun.

+0

açıkça Skip geldi oluşturulan SQL göstermek alın ve Kont biraz crummy - sonra Skip bize göstermiyor , Take ve Count. –

+0

hepsi Gridview denetimi tarafından oluşturulur. Verileri ona bağladığımdan, özel sayfalama yapmak zorunda kalmadım. – stevenjmyu

cevap

5

bu işleri katılmak nasıl, birden Proje satır

Evet

dönen gibi görünüyor: Burada iyi bir örnektir. Bir projede 5 eşleme notu varsa 5 kez gösterilir.


Sorun nedir - "Katıl" yanlış idiom!

Kimin notlar belli metni içeren projelerin filtrelemek istiyorum:

var query = db.Project 
    .Where(p => p.Notes.Any(n => n.NoteField.Contains(searchString))); 
İlgili konular