2011-08-18 15 views
1

이 두 블록이 정확히 동일합니까? 하나는 다른 것보다 이점이 있습니까? context.Table1에서LINQ와 context.entity.Where()

 using (var context = new TRANSITEntities()) 
     { 
      var result = context.Table1.Where(c => c.UserCode == "123"); 
     } 


     using (var context = new TRANSITEntities()) 
     { 
      var result = from c in context.Table1 
         where c.UserCode == "123" 
         select c; 
     } 

답변

4

정확히 동일합니다.

당신은 자신이 있으며, toString()

string query1String, query2String; 
    using (var context = new TRANSITEntities()) 
    { 
     var result = context.Table1.Where(c => c.UserCode == "123"); 
     query1String = result.Expression.ToString(); 
    } 


    using (var context = new TRANSITEntities()) 
    { 
     var result = from c in context.Table1 
        where c.UserCode == "123" 
        select c; 
     var query2String = result.Expression.ToString(); 
    } 

    Assert.AreEqual(query1String, query2String); 

또한 result 실제로 결과되는 것은 아니다 보면이를 확인할 수 있습니다. 실행되지 않았거나 열거 된 IQueryable입니다. 이것은 아직 실행되지 않은 SQL 문과 같습니다 (일종의). 당신이해야한다면

var t1 = result.ToArray() 
    var t2 = result.ToArray() 

그러면 쿼리는 실제로 두 번 실행됩니다. t1t2은 실제 결과입니다 (메모리 배열에 있음) ... not . 즉, result의 이름은 실제로 query이어야합니다. 위의 예제는 작동하지 않습니다. using 블록 외부의 결과에 ToArray을 호출하면 실행이 불가능하기 때문에 ... 실패합니다. 컨텍스트가 삭제 된 쿼리 :

using (var context = new TRANSITEntities()) 
    { 
     var result = context.Table1.Where(c => c.UserCode == "123"); 
    } 
    // throws exception: 
    var array = result.ToArray(); 
3

음 첫번째 선택, context.LINTE에서 두번째 선택한다. 따라서 그들은 완전히 다른 컬렉션을 선택합니다. UserCode 열과 CodeUsager 열에 번째에서도 첫 번째 선택

.. 그 이격

(번째 단지 번역 제이며 제 번역 깜빡) 코드는 동일합니다. C# 컴파일러는 두 번째 쿼리를 첫 번째 쿼리로 변환하며 동일하게 동작합니다.

+0

네, 저의 실수입니다. 나는 그것을 읽을 수있게하려고 노력했다. 실패. – Mathieu

+0

수정되었습니다. 성공! –

2

정확히 동일합니다. 컴파일러는 메서드를 확인하기 전에 쿼리 구문을 람다 식 버전으로 변환합니다.

1

다른 테이블에서 선택하려고하면 쿼리가 다릅니다.

그러나 테이블이 동일하면 다른 표현입니다.

코딩하는 방식에 차이가있는 것은 아닙니다.

모든 linq 쿼리는 SQL 표현식을 만들기 전에 Lambda로 변환됩니다.

1

줄리아 Lermans '책 프로그래밍 엔티티 프레임 워크에서 :

그것은 일반적으로 간단하고 읽을 수 있기 때문에 MSDN 설명서를 말한다

, "일반적으로, 우리는 쿼리 구문 추천; 그러나 메서드 구문과 쿼리 구문 사이에 의미상의 차이가 없으므로 이 없습니다. "* 따라서 하나 이상의 다른 메서드를 사용하면 스타일 및 개인 문제가 있습니다. 선택 사항입니다.