2010-04-20 8 views
2

Linq-To-Entity에서 SingleOfDefault를 사용하는 것과 비슷한 문제에 대한 다른 게시물을 읽었습니다. 일부는 "First()"를 사용하고 일부는 "Extension" 단일(). 내가 .ToList를 (사용하여 목록에 개체 쿼리를 변환하면, "SingleOrDefault()는"실제로 오류를 던지고없이 완벽하게 작동)'SingleOrDefault'는 Linq에서 엔티티로 지원하지 않습니다.

Movie movie = (from a in movies 
       where a.MovieID == '12345' 
        select a).SingleOrDefault(); 

:

이 코드는 예외가 발생합니다.

제 질문은 : 목록으로 변환하는 것이 좋지 않습니까? 더 복잡한 쿼리의 경우 성능 문제가 될 것입니까? SQL로 무엇이 번역됩니까?

Movie movie = (from a in movies.ToList() 
       where a.MovieID == '12345' 
        select a).SingleOrDefault(); 
+1

3.5를 사용하고 있습니까? SingleorDefualt는 4.0에서 지원되기 때문에 – Nix

답변

5

linq2 엔티티 팀에 관한 한 제공자 수준에서는 지원되지 않지만 확인할 방법은 here입니다.

그러나 지금까지 .NET 4에서 지원되는 것으로 알고 있습니다.

1

SingleOrDefault는 LinqToEntities (4)에서 지원됩니다.

내 생각으로는 EF 3.5를 사용하고 있습니까?

1 또는 null을 수행하는 쉬운 방법은 없습니다.

확장 기능을 사용할 카운트를 사용하는 exention을 작성합니다. 일반적으로

public static TElement SingleOrDefault<TElement> 
    (this IQueryable<TElement> query) 
{ 
    if (query.Count() > 1) 
    { 
     throw new Exception(); 
    } 
    return query.FirstOrDefault(); 
} 
+0

'.Any()'를 의미 할 때'.Count()> 1 '을 사용하지 마십시오. '.Any()'는 SQL에서 EXISTS로 매핑됩니다. 이것은 SQL COUNT보다 훨씬 효율적입니다. '.Any()'를 사용하는 것이 더욱 표현적입니다. 당신은 공급자에게 "이 알고리즘을 사용하여 존재하는지 확인하는 대신"가능한 가장 효율적인 방법으로 이것을 수행한다고 말하고 있습니다. " –

+1

어, 나는'.Count> 0'을 의미했는데, 물론 당신이 작성한 것이 아닙니다. * 그러나 .Count> 1'은'.Single()'을 대체하는 올바른 방법이 아닙니다. 후드에서 EF 4는'.Take (2) .AsEnumerable(). Count() '와 같은 것을 수행합니다. 이것은 원하는 것에 더 가깝습니다. 다시 생각해 보면, 실제로는 필요하지 않은 DB 서버에서 큰 숫자를 계산하는 완전히 별도의 쿼리를 실행하지 않는 것이 좋습니다. 어쨌든, 당신의 대답을 잘못 읽었던 것에 사과드립니다. –

3

는 평가 될 수있는 쿼리와 SQL에서 가져온 모든 데이터를 강제하기 때문에 .ToList() 또는 .AsEnumerable()를 호출 좋지 않다.

예에서 .ToList()는 모든 동영상을 가져 오므로 특히 나쁜 위치에 있습니다. 처음부터 ToList를하는 것이 더 좋을 것입니다.

EF4에 당신이 EF에서 원하는 것을

최단 형태로 이전 될 것 : -하여 데이터베이스에서 단일 시행

var movie = movies.FirstOrDefault(a => a.MovieID = 12345); 

기본 키는 오직 하나 거기 보장하기 위해 더 나은 방법이 될 것 같다 MovieID 주어진 ID를 가진 영화.

관련 문제