2014-10-18 3 views
-1

나는 일종의 저장소 역할을하는 클래스를 가지고 있으며 데이터베이스에 대한 액세스 권한을 부여합니다. 표현식을 사용하여 쿼리를 허용하도록 사용자 정의하려고합니다.Expression의 내용을 읽으려면 어떻게해야합니까?

그래서, 나는이 작업을 수행 할 수 있도록하려면 :

IList<MyClass> myList = myRepository.GetBy(x => x.Name == "SomeName"); 
//and... 
IList<MyClass> myList2 = myRepository.GetBy(x => x.Name == "SomeName" && x.ID = 5); 

이 내가 저장소 기능을 가질 필요가 무엇 :

public IList<T> GetBy(Expression<Func<T, bool>> expression) 
{ 
    //Set up the query, etc 
    //I'm at the WHERE clause, and I need to get the property(ies) name(s) of the expression and their values to properly set the WHERE 
} 

내가 어떻게 할 수 있습니까?

+4

http://msdn.microsoft.com/en-us/library/bb882521(v=vs.90).aspx – MarcinJuraszek

+0

당신이 일을 중지 무엇 'blah. 어디에서 (expression.Compile())'? – DavidG

+0

@DavidG 비효율적입니다. 'Compile'은 델리게이트를 반환하므로 데이터베이스로부터 모든 객체를 가져온 후에 서버 측에서 예측이 적용됩니다. 왜 '쿼리 가능'을 사용하지 않는지 묻습니다.어디에서 (표현식); ' –

답변

-1

질문을 올바르게 이해하면 기본 일반 저장소 인터페이스에서 저장소 인터페이스를 상속받을 수 있습니다.

public interface IRepositoryBase<TEntity> 
{ 
    IList<TEntity> GetBy(Expression<Func<TEntity, bool>> expression) 
} 

및 기본 저장소 구현에서 저장소 실현

public abstract class RepositoryBase<TEntity>: IRepositoryBase<TEntity> 
{ 
    public MyEntities EntitiesContext { get; set; } 

    public IList<TEntity> GetBy(Expression<Func<TEntity, bool>> expression) 
    { 
     return EntitiesContext.Set<TEntity>().Where(filter).ToList() 
    } 
} 
+0

이미 쿼리 공급자가있는 경우 아무 것도 할 필요가 없습니다. 이 질문의 요점은 문제의 데이터 소스에 대한 쿼리 공급자가 없다는 것입니다. – Servy

1

싶은 것은 이것이다 : IList <MyClass> myList2 = myRepository.GetBy (x => x.Name == "SomeName" && x.ID = 5); x => x.Name == "SomeName" && x.ID = 5 with Expression <Func <T, bool >>

을 나타내는 것은 사실이지만 위임자 인 Func <T, bool>만으로도 수행 할 수 있습니다. 에 관계없이 매개 변수 대리인 Func <T, bool>로 받아들 (네임 스페이스 System.Linq를 사용할 때마다) 그래서 당신은 항상 Where 방법이있을 것이다 항상 IEnumerable <T>에서 할 데이터를 취할 된의

. 개체 IEnumerable <T>DbSet <T> 인 경우이 쿼리는 대리자 Func <T, bool>을 SQL 쿼리로 변환합니다. 사용되는 Linq 쿼리는 쿼리 데이터가 사용되거나 예를 들어 ToList() 또는 ToArray() 메서드와 일치 할 때만 실행된다는 점을 기억하십시오.

예 : 당신도 EntityFramework의 DbSet에서 데이터를 얻을 곳에서 IEnumerable <MyClass> list = ...

var query = list.Where (x => x.Name == "SomeName" && x.ID = 5); 

쿼리이이

foreach (var x in list) is being consumed, so the query is executed 
{ 
   var c = x.Name; 
} 

또는이 완료 될 때까지 쿼리, 그것은 데이터를 포함하지 않는 shost입니다

`var temp = query.ToList();` 

a List <MyClass>EntityFramework의 DbSet을 사용하는 경우 대리자 Func <T, bool>이 SQL 쿼리로 변환되므로 데이터 관리자가 데이터 필터링을 담당해야한다는 것을 말하고 싶습니다. 이로부터 혼자 당신은 단순히 당신의 방법이해야

public IList <T> GetBy (Func <T, bool> expression) 
{ 
    origen.Where (expression).ToList(); 
}