2009-07-08 14 views
17

Aşağıdaki sorguda bir kayıp yaşıyorum, bu da düz T-SQL'de yer alan yer fıstığı.Linq to Ensities birçok sorguyu seç

üç fiziksel tablolar vardır:

  • bant (PK = BandId)
  • MusicStyle (PK = MuicStyleId)
  • BandMusicStyle (PK = BandId + MusicStyleId, FK = BandId, MusicStyleId)

Şimdi yapmaya çalıştığım şey, adında belirli bir arama ölçütlerini içeren bir Band'a bağlı olan MusicStyles listesidir. Grup adı, sonuçta olmalıdır.

T-SQL böyle bir şey olurdu:

SELECT b.Name, m.ID, m.Name, m.Description 
FROM Band b 
INNER JOIN BandMusicStyle bm on b.BandId = bm.BandId 
INNER JOIN MusicStyle m on bm.MusicStyleId = m.MusicStyleId 
WHERE b.Name like '%@searchstring%' 
Ben varlıkları için Linq yazarsınız nasıl

?

Not: StackOverflow Eğer ilişki içinde tanımlarsanız aslında, herhangi bir şey yazmaya gerek yok, bazı bizar nedenle 'pek çok' dizesi arama ... Linq yılında

cevap

27

Bu görünüyordu çok daha basit olduğunu kanıtladı. Bu sorunu çözdüm. Şu blog yazısını kullanarak sorunu çözdüm: http://weblogs.asp.net/salimfayad/archive/2008/07/09/linq-to-entities-join-queries.aspx

Bu çözümün anahtarı, müzik grubunun koleksiyonlarının bir alt kümesinde grup adının filtresini uygulamaktır.

var result=(from m in _entities.MusicStyle 
      from b in m.Band 
      where b.Name.Contains(search) 
      select new { 
       BandName = b.Name, 
       m.ID, 
       m.Name, 
       m.Description 
      }); 

ihbar hattı

from b IN m.Band 

Bu, yalnızca bir musicstyle sahip bantlar üzerinde filtreleme emin olur.

Yanıtlarınız için teşekkürler, ancak hiçbiri sorunumu gerçekten çözmedi.

+1

Bir iç birleştirme yerine sol bir birleştirmeye ihtiyacınız varsa, 'dan b' den b 'ye b' den b.Band.DefaultIfEmpty() 'içinde b ile değiştirebilirsiniz. –

+0

Basit, Keskin ve kullanışlı. Teşekkürler dostum. – QMaster

+0

@Peter, linq yöntemini kullanırsak, '.... .... 'sözdizimini kapsayacak şekilde hangi yöntemi kullanmalıyım? örneği linq yöntemiyle verebilir misiniz? teşekkürler – Willy

4

izin vermez SQL veritabanındaki şema ve yardımcı program kullanılarak oluşturulan nesne hiyerarşisi otomatik olarak oluşturulur. Eğer varlıkların oluşturulan sınıflara bakarsak

var bands = from ms in db.MusicStyle 
      let b = ms.Bands 
      where b.Name.Contains(SEARCHSTRING) 
      select new { 
       b.Name, ms.Name, 
       ms.ID, ms.Description}; 

, BandMusicStyle LINQ olarak varlıkları için görünmemelidir Bant ve MusicStyle birçok çoktur ve bu tablo gerekli olmadığını göz önünde bulundurun: Bu yapman olmadığı anlamına gelir.

Çalışıyor mu?

+0

BandMusicStyle tablosu veri modelimde görünmüyor. Sadece adında arama yapan bir Band'a bağlı bir müzik listesine sahip olmak istiyorum. Bandname, MusicStyleId, MusicStyleName ve MusicStyleDescription ile yaptığınız sorgunun dışındaki nesnelere nasıl ulaşırsınız? Bu listeyi tekrarlamak ve daha sonra elle oluşturmak zorunda kalmak istemiyorum ... – Peter

+0

BandMusicStyle tablosu Varlık modelinde YOKTUR. Bu, LINQ tarafından Varlıklar tarafından bilerek yapılır, çünkü ara tablonun, sadece bir "çok fazla birleşim" olduğunu ve böylece Linq 2 SQl gibi üretilmeyeceğini düşünür. SADECE bu alanlara ihtiyacınız varsa, select deyiminizdekileri seçebilirsiniz: yeni {b.Name, b.MusicStyle.Name, b.MusicStyle.ID, b.MusicStyle.Description}; – xandy

+0

Evet, bunun görünmeyeceğini biliyorum ... Geçerli sorgunuzda yaşadığınız problem, b.Musicstyle'in bir MusicStyles koleksiyonudur, çünkü bir Band birden çok MusicStyles'e sahip olabilir. – Peter

0
from ms in Context.MusicStyles 
where ms.Bands.Any(b => b.Name.Contains(search)) 
select ms; 

Bu yalnızca stilinizi döndürür, sorunuzu sorar. Öte yandan, örnek SQL'iniz stil ve bantları döndürür.

from b in Context.Bands 
where b.Name.Contains(search) 
group b by band.MusicStyle into g 
select new { 
    Style = g.Key, 
    Bands = g 
} 

from b in Context.Bands 
where b.Name.Contains(search) 
select new { 
    BandName = b.Name, 
    MusicStyleId = b.MusicStyle.Id, 
    MusicStyleName = b.MusicStyle.Name, 
    // etc. 
} 
+0

, SQL deyimimde yazdığım öğeleri içeren yeni nesnelerin listesini döndürmek mümkün değil mi? – Peter

+0

Elbette. Gruplama ve anonim bir tür döndürme. Bir örnek ekleyeceğim. –

1

Yukarıda yapabilirdi, ama onların üzerinde yineleme başlar ve filtreleme hafızasında-in yerine db yapılır keresinde tüm sonuçlar getirecektir: Bunun için, ben yapardım.

Bence aradığın şey sadece birkaç tane mi? Bu yöndeki

var q = from b in db.Bands 
join bm in db.BandMusicStyle on on b.BandId equals bm.BandId 
join ms in db.MusicStyle on bm.MusicStyleId equals m.MusicStyleId 
where b.Name.Contains(searchString) 
select new { b.Name, ms.ID, ms.Name, ms.Description }; 

falan neyse

+1

Sorun, Linq To Entities uygulamasının tablonuzdaki yabancı anahtarlar için size özellik sağlamasıdır. Ayrıca BandMusicStyle gibi bir linktable sadece bir Band ve MusicStyle'ı birbirine bağlamak için olduğu için mevcut değildir. – Peter

+0

Ah, hala Linq - Sql modundayım –

+0

Hey en azından sorunu doğru bir şekilde çözdünüz, çok kötü, ihtiyacım olan teknolojiyi kullanmam ... – Peter