2010-03-12 1 views
5

Jestem w pierwszych kilku dniach z wykorzystaniem Linq w C#, i jestem ciekawy, czy istnieje bardziej zwięzły sposób pisania następujących.Jakikolwiek sposób użycia połączenia w Lambda Gdzie() na stole <>?

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 
} 

wiem, że gdybym chciał sprawdzić istnienie wartości w zakresie jednej tabeli, może po prostu użyć następujących:

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

Ale jestem ciekaw wiedzieć, czy istnieje sposób na wykonanie techniki lambda, ale gdzie spełniłby warunki pierwszej techniki w tych dwóch tabelach.

Przepraszamy za jakiekolwiek błędy lub jasność, będę edytować w razie potrzeby. Z góry dziękuję.

+1

Myślę, że powinieneś przenieść "Convert.ToInt32 (MyDropDownList.SelectedValue)" do zmiennej lokalnej. –

+0

Tak, istnieje (patrz post tvanfosson), jednak uważam, że kod, który napisałeś jest bardziej zrozumiały. Osobiście, jeśli muszę korzystać z łączenia, wolę nie korzystać z funkcjonalnego podejścia Linq. – AxelEckenberger

+0

@Andrew, dlaczego przenieść go do zmiennej lokalnej? czytelność? @Obalix - Zgadzam się, ale czuję, że może to być spowodowane moim niepełnym zrozumieniem składni. Po tym, jak lepiej zrozumiem, co się dzieje i kiedy użyć czego, mam wrażenie, że wolę podejście funkcjonalne. –

Odpowiedz

2

Tak, można to zrobić metodami extension. Zauważ, że możesz uzyskać bardziej zwięzłe zapytanie, najpierw filtrując każdą tabelę, ale podejrzewam, że SQL Server i tak by ją zoptymalizował.

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

Otrzymuję wyjątek od powyższego kodu stwierdzający "Brak przeciążenia dla metody" Dołącz "przyjmuje" 2 "argumenty". –

+0

@lush - przepraszam, miałem błędnie podpis. Potrzeba dwóch selektorów klawiszy (zewnętrznego i wewnętrznego), a następnie selektora dla wyniku. W tym przypadku po prostu wybrałem obiekt zewnętrzny, ponieważ ostatecznie zostanie on przetłumaczony na KAŻDE zapytanie. Dodałem również link do strony MSDN dla metody rozszerzenia złączeń, aby zobaczyć alternatywną składnię. – tvanfosson