2010-03-12 14 views
5

Ben ilk birkaç gün içinde C# Linq kullanarak yaşıyorum ve aşağıdaki yazının daha kısa bir yolunun olup olmadığını merak ediyorum.Bir Lambda Katılmanın Her Yolu Bir Tabloda Nerede() <>?

if(db.TableA.Where(u => u.UserID == CurrentUser).Any()) 
{ 
    //snip 
} 

Ama merak ediyorum:

MyEntities db = new MyEntities(ConnString); 

var q = from a in db.TableA 
     join b in db.TableB 
     on a.SomeFieldID equals b.SomeFieldID 
     where (a.UserID == CurrentUser && 
     b.MyField == Convert.ToInt32(MyDropDownList.SelectedValue)) 
     select new { a, b }; 

if(q.Any()) 
{ 
//snip 
} 

ben tek bir tablo alanında bir değerin varlığını kontrol etmek istiyorum olsaydı, ben sadece şu kullanabilirsiniz biliyor lambda tekniğini yapmak için bir yol olup olmadığını, ancak bu iki tablodaki ilk tekniğin koşullarını karşılayacağını bil.

Herhangi bir hata veya netlik için özür dileriz, gerektiği gibi düzenlerim. Şimdiden teşekkürler.

+1

"Convert.ToInt32 (MyDropDownList.SelectedValue)" öğesini yerel değişkene taşımanız gerektiğini düşünüyorum. –

+0

Evet, var (bkz. Tvanfosson postası), ancak yazdığınız kodun daha anlaşılabilir olduğuna inanıyorum. Şahsen, eğer birleştirme kullanmak zorunda kalırsam, işlevsel Linq yaklaşımını kullanmamayı tercih ederim. – AxelEckenberger

+0

@Andrew neden yerel bir değişkene taşıyalım? okunabilirliği? @Obalix - Ben aynı fikirde değilim, ancak bunun sözdizimiyle ilgili eksik anlaşılmamdan kaynaklandığını hissediyorum. Neler olup bittiğini ve ne zaman kullanılacağını daha iyi anladıktan sonra, işlevsel yaklaşımı tercih edeceğimi hissediyorum. –

cevap

2

Evet, bunu extension yöntemleriyle yapabilirsiniz. Her bir tabloyu filtreleyerek daha özlü bir sorgu alabileceğinizi unutmayın, ancak SQL Server'ın bu şekilde optimize edeceğinden şüpheleniyorum.

if (db.TableA.Where(a => a.UserID == CurrentUser) 
     .Join(db.TableB.Where(b => b.MyField == Convert.ToInt32(MyDDL.SelectedValue)), 
      o => o.someFieldID, 
      i => i.someFieldID, 
      (o,i) => o) 
     .Any()) { 
    ... 
} 
+0

Yukarıdaki koddan "Yöntem 'Join' 2 'argümanları' yöntemine katılma yok" belirten bir istisna alıyorum. –

+0

@lush - Üzgünüm, imzam yanlış oldu. İki anahtar seçiciyi (dış ve iç), ardından sonuç için bir seçiciyi alır. Bu durumda, en sonunda bir dış sorguya dönüştürüleceğinden, dış nesneyi seçtim. Ayrıca, birleştirme eklenti yöntemi için MSDN sayfasına bir bağlantı ekledim, böylece alternatif sözdizimini görebilirsiniz. – tvanfosson

İlgili konular