2013-10-15 2 views
1

다음 LINQ 문이 주어지면 select 부분을 리팩토링 할 수 있는지 여부를 말해 줄 수 있습니까? 나는 표현 트리를 사용하지 않았으며 Selects에 관한 많은 정보를 찾을 수 없었습니다. 이것은 SQL로 변환되어 메모리가 아니라 SQL Server 내에서 실행된다는 점에 유의하십시오. 내가 좋아하는 것LINQ select 문을 리팩토링하는 방법

var results = db.Widgets 
    .Select(w => new 
    { 
     Name = (w is x) ? "Widget A" : "Widget B" 
    }); 

이 작업을 수행 할 수 있어야합니다 ..

var name = [INSERT REUSABLE EXPRESSION] 
var somethingElse = [INSERT REUSABLE EXPRESSION] 
var results = db.Widgets.Select(w => new { Name = name, SomethingElse = somethingElse }); 

은 물론 용도는 더 복잡한 문장입니다.

+0

그래서'WidgetType'은 문자열입니까? 표현식을 문자열에 지정하고 싶습니까? 또는 WidgetType을 표현식으로 사용 하시겠습니까? –

+0

@JeroenvanLangen WidgetType은 문자열입니다. 임은 내 LINQ 코드에서 일반적으로 사용되는 리팩터링 방법을 찾으려고 시도합니다 – Grant

+0

'표현식'이 '델리게이트'와 매우 유사하다는 것을 알고있는 한 차이점은 클라이언트의 로직을 SQL 쿼리로 변환하는 데 사용됩니다. 서버에서 쿼리를 실행하고 결과를 다시 얻으십시오. ** 그래서 작성한 코드는 매우 이상하고 달성하기가 어렵습니다. 적어도 위임 또는 표현을 전달하는 규칙을 따라야합니다. 방법. –

답변

0

LinqKit을 사용하면됩니다. 메소드가 SQL로 변환 될 수있는 한 계속 작동합니다.

public static class ReusableMethods 
{ 
    public static Expression<Func<int, Person>> GetAge() 
    { 
     return p => p.Age; 
    } 
} 

var getAge = ReusableMethods.GetAge(); 
var ageQuery = from p in People.AsExpandable() 
       select getAge.Invoke(p); 

참고 것을 :

  1. 당신은 당신 된 IQueryable에 AsExpandable()를 추가 할 필요가 이것은 완전한 예제가 어떻게 보이는지 본질적이다.
  2. 메소드를 사용하기 전에 로컬 변수에 할당해야합니다 (정확한 이유는 확실하지 않지만 반드시 필요합니다).
관련 문제