Nhibernate 使用NLinq跨实体创建规范时遇到问题
我正在使用规范模式,并且有一个工作实现(取自WhoCanHelpMe Codeplex项目),用于通过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
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); }
}
}