2009-05-14 4 views
3

downvoting 또는 closing 전에 읽기 :previous question of mine의이 거의 정확한 복제본은 이전 질문을 Linq-To-Sql 범위로 바꿔주는 유일한 목적으로 존재합니다. 이전 질문에 포함 된 모든 대답은 Linq 범위에서 유효하지만 Linq-To-SQL 범위에서는 유효하지 않습니다.비슷한 여러 Linq-SQL 쿼리를 리팩토링하는 방법은 무엇입니까?

var someValue1 = 0; 
var someValue2= 0; 
var query1 = db.TableAs.Where(a => a.TableBs.Count() > someValue1) 
       .Take(10); 
var query2 = db.TableAs.Where(a => a.TableBs.First().item1 == someValue2) 
       .Take(10); 

주에만 매개 변수 변경 : 가정하자

내가 리팩토링 할 다음 두 Linq에 - 투 - SQL 쿼리를 가지고있다. 메서드 내에서 쿼리를 넣고 Where 매개 변수를 인수로 전달하는 방법은 무엇입니까?

previous question에 게시 된 모든 솔루션은 결과를 나열하려고 시도 할 때 런타임에 시도되고 실패했습니다. 던져

예외는 있었다 :

답변

6

물론 "를 질의 연산자 ''가 사용되지 않는 과부하". 당신은 쓸 것 :

public IQueryable<A> First10(Expression<Func<A,bool>> predicate) 
{ 
    return db.TableAs.Where(predicate).Take(10); 
} 

을 (즉, TableAIQueryable<A>이라고 가정합니다.)

전화를 함께 :

var someValue1 = 0; 
var someValue2= 0; 
var query1 = First10(a => a.TableBs.Count() > someValue1); 
var query2 = First10(a => a.TableBs.First().item1 == someValue2); 

내가 작동 믿을 ...

이 질문과 이전 질문에 대한 대답의 차이점은 기본적으로이 방법은입니다. 대신 Func<T,bool> 대신을 입력하면 Enumerable.Where 대신 Queryable.Where이 사용됩니다.

+0

Strangr, 나는 두 경우 모두 시도 : 표현 > c1 = t => true; Console.WriteLine (db.Table1.Where (c1) .Count()); Func c2 = t => true; Console.WriteLine (db.Table1.Where (c2) .Count()); 그들은 동일한 결과를 얻었고 런타임 오류는 없었습니다. –

1

정말로 재사용을 원할 경우 자신의 운영자를 작성할 수 있습니다. 예 : 대신 반복적으로 쓰는 :

public static IEnumerable<Product> ByName(this IEnumerable<Product> products, string description) 
{ 
    return products.Where(p => p.Description.Contains(description)); 
} 


public static IEnumerable<Product> AreDiscontinued(IEnumerable<Product> products, bool isDiscontinued) 
{ 
    return products.Where(p => p.Discontinued == discontinued); 
} 

을 다음과 같이 사용 :

var query = 
Products 
    .Where(p => p.Description.Contains(description)) 
    .Where(p => p.Discontinued == discontinued); 

당신이 간단한 방법을 쓸 수

var query = Products.ByName("widget").AreDiscontinued(false); 
관련 문제