Linq

2010-10-26 20 views
8

'daki birleştirme anahtar sözcüğü ile ifade edilen birleşimler üzerinden SelectMany() ile birleşen katılımları birleştirmek için Linq, birleştirme anahtar sözcüğünü kullanarak iç bağlantıların veya SelectMany() öğesinin (bir çift anahtar sözcükle) anahtar kelime:Linq

var personsToState = from person in persons 
        join state in statesOfUS 
        on person.State equals state.USPS 
        select new { person, State = state.Name }; 
foreach (var item in personsToState) 
{ 
    System.Diagnostics.Debug.WriteLine(item); 
} 

// The same query can be expressed with the query operator SelectMany(), which is 
// expressed as two from clauses and a single where clause connecting the sequences.      
var personsToState2 = from person in persons 
         from state in statesOfUS 
         where person.State == state.USPS 
         select new { person, State = state.Name }; 
foreach (var item in personsToState2) 
{ 
    System.Diagnostics.Debug.WriteLine(item); 
} 

sorum: ne zaman, nerede tarzı kullanmak katılmak tarzı kullanmak ve ne zaman amaca uygundur diğer tarzı üzerinden bir stil performans avantajları vardır?

cevap

6

Eğer SelectMany daha fazla kilometre elde edersiniz ancak LINQ to SQL (L2S) için, nedeniyle Athari mentioned olarak anahtarlı arama için daha verimlidir. L2S'de SelectMany sonuçta, sorgunuza bağlı olarak oluşturulan SQL'de bir tür SQL birleştirmesi kullanır.

Joseph/Ben Albahari tarafından yazılan sorulara bir göz atınız. C# 4.0 yazarlarının bir özetidir. Onlar katılır Farklı türde örnekler göstermek ve onlar devlet:

SQL, LINQ ile

en esnek katılır ve equi ve non-equi hem katılır gerçekleştirebilir SelectMany tabanlı. DefaultIfEmpty'de atın ve 'u da sol dış bağlantılara yapabilirsiniz! LINQ: Building an IQueryable provider - Part VII: burada IQueryable/SQL ile ilgilidir Buna ek olarak

Matt Warren bu konuda detaylı bir blog yazısı vardır.

Hangisini kullanacağınız sorusuna dönün, hangisi daha okunaklı olursa olsun sorgulama yapmalı ve kendinizi kolayca ifade etmenize ve nihai hedefinizi net bir şekilde oluşturmanıza olanak tanır. Büyük koleksiyonlarla uğraşmadıkça ve her iki yaklaşımı da göz önünde bulundurmadığınız sürece, performans başlangıçtaki bir sorun olmamalıdır. L2S'de esnekliği göz önünde bulundurmanız gerekir. SelectMany, verilerinizi eşleştirmeniz için gereken yola göre size teklif verir.

2

Daha etkin birleştirme, eşleştirme değerlerini bulmak için Arama sınıfını (tek bir tuş için birden çok değer içeren bir Varyasyon) kullanır. Yerel sorguları Join için

+0

Her iki yöntem de * etkilidir *, ancak birleştirme daha fazla * etkin * ... –

+0

@Thomas Levesque Düzeltmeniz için teşekkür ederiz, ingilizce ana dilim değil. – Athari