2010-03-12 3 views
5

저는 C#에서 Linq를 사용하여 처음 몇 일을 보았습니다. 다음 문장을 작성하는보다 간결한 방법이 있는지 궁금합니다.람다에서 조인을 사용하는 방법 Where() 테이블에서 <>?

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

하지만 궁금 :

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 
} 

는 내가 단일 테이블의 필드에 값의 존재를 확인하고자한다면, 난 그냥 다음을 사용할 수 있다는 것을 알 람다 기법을 수행하는 방법이 있는지를 알아야하지만, 두 테이블에서 첫 번째 기법의 조건을 만족시킬 수있는 곳이 있는지 확인하십시오.

실수 나 명확한 점이 있으면 죄송합니다. 필요에 따라 수정하겠습니다. 미리 감사드립니다.

+1

"Convert.ToInt32 (MyDropDownList.SelectedValue)"를 로컬 변수로 이동해야한다고 생각합니다. –

+0

그래, 거기에 (tvanfosson의 게시물을 참조하십시오),하지만, 당신이 작성한 코드를 더 이해할 수 있다고 생각합니다. 개인적으로 조인을 사용해야하는 경우 기능적 Linq 방식을 사용하지 않는 것이 좋습니다. – AxelEckenberger

+0

@Andrew 왜 로컬 변수로 이동합니까? 가독성? @Obalix - 동의하는 경향이 있지만 구문에 대한 불완전한 이해로 인한 것 같습니다. 무슨 일이 일어나고 있는지, 무엇을 언제 사용하는지 더 잘 이해하고 나면 기능적 접근 방식을 선호하게 될 것입니다. –

답변

2

예, extension 방법을 사용하면됩니다. SQL Server가 이러한 방식으로 최적화 할 수 있다고 생각할지라도 각 테이블을 먼저 필터링하여 좀 더 간결한 쿼리를 얻을 수 있습니다.

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

위의 코드에서 "메서드 'Join'에 대한 과부하는 '2 개의 인수'를 사용한다는 예외가 발생합니다. –

+0

@lush - 죄송합니다. 서명이 잘못되었습니다. 그것은 두 개의 키 선택 자 (바깥 쪽과 안쪽)를 취한 다음 결과를위한 선택자를 취합니다. 이 경우 외부 객체는 결국 ANY 쿼리로 변환되므로 간단히 선택합니다. 또한 조인 확장 메서드에 대한 MSDN 페이지에 대한 링크를 추가하여 대체 구문을 볼 수 있습니다. – tvanfosson

관련 문제