Nhibernate 使用NLinq跨实体创建规范时遇到问题

Nhibernate 使用NLinq跨实体创建规范时遇到问题,nhibernate,fluent-nhibernate,specification-pattern,Nhibernate,Fluent Nhibernate,Specification Pattern,我正在使用规范模式,并且有一个工作实现(取自WhoCanHelpMe Codeplex项目),用于通过NLinq、通用存储库和所有这些功能获取数据 根方法是: public IList<Case> GetCasesByUsername(string username) { CaseByUserNameSpecification spc = new CaseByUserNameSpecification(username); return this.caseReposi

我正在使用规范模式,并且有一个工作实现(取自WhoCanHelpMe Codeplex项目),用于通过NLinq、通用存储库和所有这些功能获取数据

根方法是:

public IList<Case> GetCasesByUsername(string username)
{
    CaseByUserNameSpecification spc = new CaseByUserNameSpecification(username);
    return this.caseRepository.FindAll(spc).ToList();
}
以及,用户:

public class User : Entity
{
    private ICollection<CaseUser> caseUsers = new HashSet<CaseUser>();

    public virtual Account Account { get; set; }
    public virtual string UserName { get; set; }
    ...
    public virtual IEnumerable<CaseUser> CaseUsers { get { return caseUsers; } }
}
公共类用户:实体
{
private ICollection caseUsers=new HashSet();
公共虚拟帐户{get;set;}
公共虚拟字符串用户名{get;set;}
...
公共虚拟IEnumerable CaseUsers{get{return CaseUsers;}}
}

如何编写表达式来获取关联表中的数据?

我认为您的规范实现应该如下所示:

public class CaseByUsernameSpecification : QuerySpecification<Case> 
{ 
    private string userName; 

    public CaseByUsernameSpecification(string userName) 
    { 
        this.userName = userName; 
    } 

    public string UserName 
    { 
        get { return this.userName; } 
    } 

   public override Expression<Func<Case, bool>> MatchingCriteria 
    { 
        get { return c => c.CaseUsers.Any(cu => cu.User.Username == this.userName); } 
    } 

}
公共类CaseByUsernameSpecification:QuerySpecification
{ 
私有字符串用户名;
public CaseByUserName指定(字符串用户名)
{ 
this.userName=用户名;
} 
公共字符串用户名
{ 
获取{返回this.userName;}
} 
公共重写表达式匹配条件
{ 
获取{return c=>c.CaseUsers.Any(cu=>cu.User.Username==this.Username);}
} 
}

我认为您的规范实现应该如下所示:

public class CaseByUsernameSpecification : QuerySpecification<Case> 
{ 
    private string userName; 

    public CaseByUsernameSpecification(string userName) 
    { 
        this.userName = userName; 
    } 

    public string UserName 
    { 
        get { return this.userName; } 
    } 

   public override Expression<Func<Case, bool>> MatchingCriteria 
    { 
        get { return c => c.CaseUsers.Any(cu => cu.User.Username == this.userName); } 
    } 

}
公共类CaseByUsernameSpecification:QuerySpecification
{ 
私有字符串用户名;
public CaseByUserName指定(字符串用户名)
{ 
this.userName=用户名;
} 
公共字符串用户名
{ 
获取{返回this.userName;}
} 
公共重写表达式匹配条件
{ 
获取{return c=>c.CaseUsers.Any(cu=>cu.User.Username==this.Username);}
} 
}

这很有效。在发布并使用Where()而不是Any()之后,我正在处理它,但由于某种原因,它被阻塞了。不知道为什么,这很有效。在发布并使用Where()而不是Any()之后,我正在处理它,但由于某种原因,它被阻塞了。不知道为什么。
public class Case : Entity
{
    private ICollection<CaseUser> caseUsers = new HashSet<CaseUser>();

    public virtual Patient Patient { get; set; }
    public virtual string CaseNb { get; set; }
    ...
    public virtual IEnumerable<CaseUser> CaseUsers { get { return caseUsers; } }
}
public class CaseUser : Entity
{
    public virtual Case Case { get; set; }
    public virtual User User { get; set; }
    ...
}
public class User : Entity
{
    private ICollection<CaseUser> caseUsers = new HashSet<CaseUser>();

    public virtual Account Account { get; set; }
    public virtual string UserName { get; set; }
    ...
    public virtual IEnumerable<CaseUser> CaseUsers { get { return caseUsers; } }
}
public class CaseByUsernameSpecification : QuerySpecification<Case> 
{ 
    private string userName; 

    public CaseByUsernameSpecification(string userName) 
    { 
        this.userName = userName; 
    } 

    public string UserName 
    { 
        get { return this.userName; } 
    } 

   public override Expression<Func<Case, bool>> MatchingCriteria 
    { 
        get { return c => c.CaseUsers.Any(cu => cu.User.Username == this.userName); } 
    } 

}