2013-04-24 5 views
9

ASP.NET, C#, Web Application에서 Entity Framework를 사용하고 있습니다. 데이터 액세스 레이어의 데이터베이스에서 레코드를 선택해야하는 경우 어떤 방법을 사용해야합니까? Linq 쿼리 또는 람다 식?Linq 쿼리 또는 람다 식?

예 : -

//Linq   
var result = from a in db.myTable.Take(1) where a.Id == varId select a; 
return result.First(); 

//Lambda 
return db.myTable.FirstOrDefault(a => a.Id == varId); 

다른 이상이 시나리오 또는 활용에 어떤 선호하는 방법이 있나요?

+5

원하는대로 사용하십시오. (그들은 BTW : 그들은 똑같은 일을하지 않습니다) – I4V

+1

가능한 중복 [LINQ - 쿼리 구문 대 메서드 체인 & lambda (http://stackoverflow.com/questions/8037677/linq-query-syntax-vs-method-chains) -lambda) – I4V

답변

14

쿼리 식은 FirstFirstOrDefault에 다르게 동작하지만 코드에서 차이가 없어야하므로 메서드 식 (람다 식)으로 컴파일됩니다.

참조 : 컴파일시에 Query Syntax and Method Syntax in LINQ (C#)

LINQ Query Expressions (C# Programming Guide), 쿼리 표현식 앞뒤 C# 사양에서 설정 한 규칙에 따라 호출 표준 쿼리 운영자 방법으로 변환됩니다. 쿼리 구문 을 사용하여 표현할 수있는 쿼리는 메서드 구문을 사용하여 표현할 수도 있습니다. 그러나 대부분의 경우 쿼리 구문이 더 읽기 쉽고 간결합니다.

+2

msdn 링크의 경우 +1 –

+0

할당은 어떻게됩니까? – dariol

0

결과가 같아 보입니다. 람다는 좀 더 편안합니다. 한 테이블의 결과가 필요한 경우 람다 식은 매우 빠르고 읽기 쉽습니다.

5

Linq 쿼리 구문은 표현 방법에 대한 구문 설탕 일뿐입니다. 표현식 메소드로 컴파일 된 모든 Linq 질의. BTW 첫 번째 쿼리 :

var query = from a in db.myTable.Take(1) 
      where a.Id == varId 
      select a; 
return query.First(); 

Linq에를 사용하여 시도의

return db.myTable.Take(1).Where(a => a.Id == varId).First(); 
3

모두 동일합니다.

첫 번째 레코드는 하나의 레코드를 가져와 id가 일치하는지 확인합니다.

두 번째 레코드는 id가 일치하는 첫 번째 레코드를 사용합니다.

그 차이가 있습니다.

0

모든 쿼리 식은 쿼리 연산자를 확장 메서드로 호출하여 C# 코드로 나타낼 수 있습니다. 그러나 그 반대는 사실이 아닙니다. 표준 쿼리 연산자의 작은 하위 집합 만 쿼리 식의 키워드로 사용할 수 있습니다. 즉, 쿼리 식에는 메서드 호출 메커니즘에없는 몇 가지 제한 사항이 있습니다.

  1. 일부 쿼리 연산자에는 C# 쿼리식이 없습니다. ToArray().
  2. C#의 쿼리 식에서 모든 종류의 오버로드를 사용할 수는 없습니다. 예 : 현재 반복 된 객체의 인덱스를 기다리는 Select()의 오버로드가 있습니다. 쿼리 식 내에서이 오버로드를 호출 할 수 없습니다.
  3. 쿼리 식에서 명령문 람다를 사용할 수 없습니다. - 이것이 개체 및 컬렉션 초기화 프로그램이 C# 언어에 도입 된 이유입니다.