2014-12-08 3 views
0

람다 식의 "속성을 확인할 수 없습니다"이들은 내가 선택하려고 해요 클래스입니다유창함 NHibernate에 내가 유창함 NHibernate에 만 규칙에 의해 매핑을 사용하고

//The attributes are used in my conventions 
[Table("Entries")] 
public class Entry 
{ 
    [Id] public virtual int EntryID { get; set; } 
    [Join("UserID", Join.Left)] public virtual User User { get; set; } 
} 

[Table("Users")] 
public class User 
{ 
    [Id] public virtual int UserID { get; set; } 
    public virtual string Name { get; set; } 
} 

내 선택 기능이입니다 :

public IList<T> GetBy<T>(Expression<Func<T, bool>> expression) where T : class 
{ 
    ISession session = _dal.GetSession(typeof(T)); 
    ICriteria criteria = session.CreateCriteria<T>(); 

    //Error: could not resolve property "User.Name" 
    criteria.Add(Restrictions.Where<T>(expression)); 

    return criteria.List<T>(); 
} 

그리고 나는이 표현에 전화 해요 :

IList<Entry> entries = Repository.GetBy<Entry>(e => e.User.Name == "Myself"); 

위의 코드는 특급 작동 ressions '멤버가 루트 클래스에 속해 있지만 클래스 속성 중 하나를 포함하지 않는 경우에는 내 질문에 어쨌든 간단한 방법으로 작업 위의 코드를 수행 할 수 있습니까? (직접 표현식을 분석 할 필요없이).

+1

u.Name == "Myself"를 수행 할 수 있도록 "User"의 투영을 만들어야합니다. 기준은 두 번째 수준의 간접 참조 (e.User.Name)를 해결하지 못한다는 것을 기억합니다. –

답변

0

@Claudio Redi 주석처럼 조건은 두 번째 수준의 간접 참조 (e.User.Name)를 해결하지 않습니다. 샘플의 경우이 문제를 해결하기 위해 LINQ를 사용할 수 있습니다.

public IList<T> GetBy<T>(Expression<Func<T, bool>> expression) where T : class 
{ 
    ISession session = _dal.GetSession(typeof(T)); 

    var query = session.Query<T>().Where(expression); 

    return query.ToList(); 
}