C# 在fluent Nhibernate中是否有一种流畅的方法来执行条件查询?
目前,我创建的标准如下:C# 在fluent Nhibernate中是否有一种流畅的方法来执行条件查询?,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,目前,我创建的标准如下: gameCriteria = Restrictions.Eq("Name", videoGameName); 我想知道fluent nhibernate是否添加了允许以下功能的功能: gameCriteria = Restrictions.Eq<VideoGame>(v => v.Name, videoGameName); gameCriteria=Restrictions.Eq(v=>v.Name,videoGameName); 简言之,我想去
gameCriteria = Restrictions.Eq("Name", videoGameName);
我想知道fluent nhibernate是否添加了允许以下功能的功能:
gameCriteria = Restrictions.Eq<VideoGame>(v => v.Name, videoGameName);
gameCriteria=Restrictions.Eq(v=>v.Name,videoGameName);
简言之,我想去掉这根神奇的绳子。(我的实际查询往往涉及许多神奇的字符串,这些字符串会由于打字错误等而导致错误。)刚刚在另一位开发人员编写的存储库中找到了答案
gameCriteria = Restrictions.Eq(Projections.Property<VideoGame>(v => v.Name), videoGameName);
gameCriteria=Restrictions.Eq(Projections.Property(v=>v.Name),videoGameName);
现在我觉得自己花了这么多时间来搜索这个东西很傻。有一个内置的NHibernate类。它提供了以下方法:
/// <summary>
/// Build an ICriterion for the given property
/// </summary>
/// <param name="expression">lambda expression identifying property</param>
/// <returns>returns LambdaRestrictionBuilder</returns>
public static LambdaRestrictionBuilder On<T>(Expression<Func<T, object>> expression)
{
ExpressionProcessor.ProjectionInfo projection =
ExpressionProcessor.FindMemberProjection(expression.Body);
return new LambdaRestrictionBuilder(projection);
}
//
///为给定属性构建ICriterion
///
///lambda表达式标识属性
///返回LambdaRestrictionBuilder
上的公共静态LambdaRestrictionBuilder(表达式)
{
ExpressionProcessor.ProjectionInfo投影=
ExpressionProcessor.FindMemberProjection(expression.Body);
返回新的LambdaRestrictionBuilder(投影);
}
我们可以这样使用它:
// exact match
Restrictions.On<VideoGame>(v => v.Name == videoGameName);
//精确匹配
限制(v=>v.Name==videoGameName);
或
//将表达式类似为“videoGameName%”
限制.On(v=>v.Name).IsLike(videoGameName,MatchMode.Start);
Fluent NHibernate只处理映射,不处理查询。我找到了解决方案,但它可能只是核心NHibernate的一部分,与Fluent NHibernate没有什么特别的关系,这就是为什么我的搜索没有结果。你也可以使用QueryOver API或查询(LINQ)这和预测之间有显著的区别吗?我不认为这很重要。限制。On只是内置的;)最后,它将生成相同的SQL。。。重点是:内置的,应该是首选的。。。因为每一个新版本。。你可以相信。。。也许NH4会来;)。。。我只是想告诉你怎么。。。
// LIKE expression as 'videoGameName%'
Restrictions.On<VideoGame>(v => v.Name).IsLike(videoGameName, MatchMode.Start);