2009-09-19 4 views
33

다음은 IEnumerable 형식에서 잘 작동하지만 SQL 데이터베이스에 대해 IQueryable 형식에서 작동하는 것과 같은 것을 얻을 수있는 방법이 있습니까?LINQ 연산자 사이

class Program 
{ 
    static void Main(string[] args) 
    { 
     var items = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, }; 

     foreach (var item in items.Where(i => i.Between(2, 6))) 
      Console.WriteLine(item); 
    } 
} 

static class Ext 
{ 
    public static bool Between<T>(this T source, T low, T high) where T : IComparable 
    { 
     return source.CompareTo(low) >= 0 && source.CompareTo(high) <= 0; 
    } 
} 

답변

44

당신은 적절한 표현을 구성 할 수있는 경우가 단지, SQL에 LINQ와 상자 밖으로 작동 할 수있다 where 조항으로 표현합니다.

표현 트리의 관점에서이 작업을 수행하는 더 좋은 방법이있을 수 있습니다. Marc Gravell이이를 향상시킬 수는 있지만 시도해 볼 가치가 있습니다.

static class Ext 
{ 
    public static IQueryable<TSource> Between<TSource, TKey> 
     (this IQueryable<TSource> source, 
     Expression<Func<TSource, TKey>> keySelector, 
     TKey low, TKey high) where TKey : IComparable<TKey> 
    { 
     Expression key = Expression.Invoke(keySelector, 
      keySelector.Parameters.ToArray()); 
     Expression lowerBound = Expression.GreaterThanOrEqual 
      (key, Expression.Constant(low)); 
     Expression upperBound = Expression.LessThanOrEqual 
      (key, Expression.Constant(high)); 
     Expression and = Expression.AndAlso(lowerBound, upperBound); 
     Expression<Func<TSource, bool>> lambda = 
      Expression.Lambda<Func<TSource, bool>>(and, keySelector.Parameters); 
     return source.Where(lambda); 
    } 
} 

그것은 아마도하지만 참여 유형에 따라 달라집니다 - 특히, 차라리 IComparable<T>보다 비교 연산자를 사용했습니다. 나는 이것이 정확하게 SQL로 변환 될 가능성이 더 높다고 생각하지만 원하는 경우 CompareTo 메서드를 사용하도록 변경할 수 있습니다.

이처럼 호출 :

var query = db.People.Between(person => person.Age, 18, 21); 
+0

니스. 이것은 또한 Linq 표현을 조금 더 이해하게했습니다. – Dykam

+0

Jon, 죄송합니다. 수락하지 않았습니다. 날씨가 좋지 않을 때 며칠간 지냈다. 질문 : IComparable 대신 비교 연산자를 사용하는 방법에 대해 씁니다. 그게 어떻게 생겼어? 이 중 어떤 것이 IEnumerable 처럼 보이겠습니까? 나는 이것으로 놀 필요가 있으며 오늘 그렇게 할 수 있기를 바랍니다. 감사합니다! – andleer

+0

'IComparable '을 사용하면 CompareTo를 두 번 호출하기 위해 표현식 트리가 필요합니다. 모든 가능하지만 약간의 고통. "IEnumerable '처럼 보이는 것은 무엇일까? - 당신이 정교 할 수 있니? –