2010-01-11 1 views
8

나는이 문제에 실행 한 : LINQ to Entities는 "사용자 지정 방법"을 지원하지 않습니다. 어떻게 DRY 상태를 유지합니까?

Custom Methods & Extension Methods cannot be translated into a store expression

는 기본적으로 좀 복잡한 LINQ 쿼리를, 그래서 IQueryables를 돌려주는 메소드로 구현 서브 쿼리로를 분해하고 싶었다. 내 희망은이 IQueryables가 LINQ 문으로 함께 구성 될 수 있다는 것입니다 (LINQ to SQL에서 할 수있을 것으로 확신 함).

문제는 당신이 시도 할 경우 (예를 들어) 얻을 수 있습니다 : 엔티티에

LINQ는 방법을 인식하지 못하는 'System.Linq.IQueryable`1 [스레드] GetThreadsByMostReccentlyPosted (INT32) ' 메서드이고이 메서드는 을 저장소 식으로 변환 할 수 없습니다.

LINQ ORM을 사용하면 LINQ 쿼리를 작성할 수 있어야합니다. 그렇지 않으면 일반적인 검색어 로직은 복사 &이어야합니다.

이 제한 사항을 감안할 때 LINQ to Entities로 DRY 상태를 유지하려면 어떻게해야합니까?

+0

정말 알고 싶은 것은 "L2F에서 할 수있는 것처럼 EF에서 지연된 실행을 어떻게 수행합니까?"입니다. –

+0

지금까지이 작업을 수행하는 유일한 방법은 IQueryable을 IEnumerable로 변환하는 것입니다.이 시점에서 최적의 SQL 문을 생성 할 수있는 능력을 잃어버린 것 같습니다. – Schneider

+0

지연된 실행과 관련이 없습니다. 기본적으로 그것은 나에게 당신이 "일반적인 쿼리"라고 할 때 IEnumerables를 의미하는 – Schneider

답변

12

두 가지 방법 : 식을 반환

  1. 방법은 # 1의
  2. 별도의 질의 가능한 및 열거 비트

을 사용할 수 있습니다

고려 :를 들어

public Expression<Func<Foo, bool>> WhereCreatorIsAdministrator() 
{ 
    return f => f.Creator.UserName.Equals("Administrator", StringComparison.OrdinalIgnoreCase); 
} 

public void DoStuff() 
{ 
    var exp = WhereCreatorIsAdministrator(); 
    using (var c = new MyEntities()) 
    { 
     var q = c.Foos.Where(exp); // supported in L2E 
     // do stuff 
    } 
} 

2 번 예는 How to compose L2O and L2E queries입니다. 여기에 주어진 예를 고려해보십시오.

var partialFilter = from p in ctx.People 
        where p.Address.City == “Sammamish” 
        select p; 

var possibleBuyers = from p in partiallyFilter.AsEnumerable() 
        where InMarketForAHouse(p); 
        select p; 

이것은 효율성이 떨어지거나 괜찮을 수 있습니다. 그것은 당신이하는 일에 달려 있습니다. 일반적으로 예측에는 문제가 없으며 제한 사항에는 적합하지 않을 수 있습니다.

업데이트 Damien Guard의 an even better explanation of option #1을 보았습니다.

+0

나는 옵션 1을 선호합니다. [내가이 주제에 관한 블로그를 썼다] (http://www.codetunnel.com/blog/post/64/how-to-simplify-complex-linq-expressions) 나는 미친 듯이 복잡한 LINQ 표현을 가지기 때문에 유지하기가 어렵다. 뭔가해야했다. – Chev

0

EF는 메서드가 포함 된 LINQ 식에서 쿼리를 작성할 수 없습니다. EF는 SQL을 구성하기 위해 리터럴 값이 필요합니다.

주어진 경우에 필요한 엔티티의 수퍼 집합을 반환하는 "공통"쿼리로 수행 한 다음 확장 메서드와 LINQ를 사용하여 데이터베이스에서 반환 된 반환 세트의 범위를 좁혀 야합니다.

+0

을 포함하는 linq 문장을 작성하게 할 수 없을까? 예 : IQueryable과는 반대로 결과가 설정된 무언가? – Schneider

+0

"일반적인 쿼리"란 원하는 엔티티의 관리 가능한 크기의 수퍼 집합을 반환하는 데 사용할 수있는 매개 변수가있는 쿼리를 의미합니다. 디자인하는 쿼리는 데이터 및 보유한 비용에 따라 달라집니다. –

+0

알겠습니다. 하지만 이것은 메모리 합류 등을 의미합니까? – Schneider