2011-01-18 1 views
2

몇 가지 기본 조건을 몇 가지 필드로 포함하는 "IsActive"라는 간단한 LINQ to SQL 확장 메서드를 작성하면이 "IsActive"논리를 다시 사용할 수 있습니다. 논리를 복제하지 않고 장소.간단한 LINQ to SQL 확장 메서드

예를 들어,이 같은 일을 할 수 있도록하고 싶습니다 :

return db.Listings.Where(x => x.IsActive()) 

그리고이 isActive는 같은 것이다 : 그렇지 않으면

public bool IsActive(Listing SomeListing) 
{ 
    if(SomeListing.Approved==true && SomeListing.Deleted==false) 
     return true; 
    else 
     return false; 
} 

, 내가 중복해야 할 것입니다 내 시스템 전반에 걸쳐 수백만 개의 서로 다른 쿼리에서 동일한 기준을 사용합니다.

참고 : 방법은

답변

0

은이를 달성하기 위해 부분 클래스를 사용할 수 있습니다 .. SQL에 렌더링해야합니다. 다음 새 파일 대신에

: 상장 개체 (귀하의 람다에서 X) 이후

namespace Namespace.Of.Your.Linq.Classes 
{ 
    public partial class Listing 
    { 
     public bool IsActive() 
     { 
      if(this.Approved==true && this.Deleted==false) 
       return true; 
      else 
       return false; 
     } 
    } 
} 

은 객체이며, Linq은 SQL 당신은 (기능을 추가 할 수 있습니다, 부분적으로 생성 된 클래스를 정의 속성, 메소드 등)을 부분 클래스를 사용하여 생성 된 클래스에 추가합니다.

위의 내용이 SQL 쿼리로 렌더링되지 않는다고 생각합니다. SQL 쿼리에서 모든 로직을 수행하려면 where 메서드를 호출하고 필요할 때 호출하는 메서드를 만드는 것이 좋습니다.

편집

예 : 이제

public static class DataManager 
{ 
    public static IEnumerable<Listing> GetActiveListings() 
    { 
     using (MyLinqToSqlDataContext ctx = new MyLinqToSqlDataContext()) 
     { 
      return ctx.Listings.Where(x => x.Approved && !x.Deleted); 
     } 
    } 
} 

당신은 모든 활동 목록을 얻을 원할 때마다, 단지 할 수있는 명확한 필요가있다, DataManager.GetActiveListings()

+0

차가움. 감사. 이것은 SQL로 변환됩니까? – Aaron

+0

카일, 위의 예는 db를 직접 쿼리하는 것입니다. 즉, db.Where (ToList())가 없으므로 로컬 개체로 작업하지 않으므로 SQL로 변환 할 수 있습니다. Where 메서드를 호출하는 메서드를 만드는 두 번째 제안을 수행하는 방법을 설명 할 수 있습니까? 다시 한번 감사드립니다. – Aaron

+0

내 대답에 예제를 추가했습니다. 기본적으로 찾고있는 활성 목록을 반환하는 메서드를 만듭니다. –

0
public static class ExtensionMethods 
{ 
    public static bool IsActive(this Listing SomeListing) 
    { 
    if(SomeListing.Approved==true && SomeListing.Deleted==false) 
     return true; 
    else 
     return false; 
    } 
} 
+0

감사합니다. 이것은 SQL로 변환됩니까? – Aaron

+0

이 경우에는 부분 클래스가 더 적합합니다. –

4

좋은 질문 전화 서로 다른 쿼리에서 논리를 중복 지정하지 않도록 필터링 표현을 다시 사용할 수있는을 정의합니다.

이 메서드는 Where 메서드에 전달할 수있는 필터를 생성합니다. SQL로 변환 문제가 없을 것, 사용되는 Expression<Func<T, bool>> 때문에

Expression<Func<Filter, bool>> filter = GetActiveFilter() 
return db.Listings.Where(filter); 

:

public Expression<Func<Listing, bool>> GetActiveFilter() 
{ 
    return someListing => someListing.Approved && !someListing.Deleted; 
} 

그런 후하여 부른다.나중에 그런

public static IQueryable<Filter> FilterToActive(this IQueryable<Filter> source) 
{ 
    var filter = GetActiveFilter() 
    return source.Where(filter); 
} 

, 늦은 여기에 파티에

return db.Listings.FilterToActive(); 
+0

흥미 롭습니다. 나는'Expression '클래스에 대해 몰랐다. –

0

,하지만 난이 사용하는 그것을 할 수있는 또 다른 방법 :


다음은이 작업을 수행하는 별도의 방법 :

public static IQueryable<Listing> GetActiveListings(IQueryable<Listing> listings) 
{ 
    return listings.Where(x => x.Approved && !x.Deleted); 
} 

그리고 나서

var activeListings = GetActiveListings(ctx.Listings);