我使用NHibernate查询一些数据。 C#看起来像这样:
var query = NHibernateSession.Query<T>();
if (!emptyFilter)
{
query = query.Where(filter);
}
过滤器表达式是这样的:
(iif(City == null,“”,City).ToString()。ToUpper()=“Irgendwo im Niemandsland City取决于“.ToUpper()”
生成的SQL如下:
选择... atedBy_LoginName为CreatedBy27_0_, attorney0_.ModifiedBy_DisplayName为ModifiedBy28_0_, attorney0_.ModifiedBy_LoginName as ModifiedBy29_0_,ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP)as __hibernate_sort_row from tblAttorney attorney0_
where upper( cast (cast)(当attorney0_.City为null时为@ p1 其他attorney0_.City以NVARCHAR(4000)结尾为 char ))= @ p2)
as query WHERE query .__ hibernate_sort_row&gt; @ p3 ORDER BY 查询.__ hibernate_sort_row',N'@ p0 int,@ p1 nvarchar(4000),@ p2 nvarchar(4000),@ p3 int',@ p0 = 100,@ p1 = N'',@ p2 = N'Irgendwo im Niemandsland City',@ p3 = 0
这个转换为char会截断超过30的字符串(SQL deafult值),这意味着我没有收回任何数据。我还在使用DynamicQueryable来创建查询。我不知道在哪里搜索。我不知道为什么这个被装入char。
DynamicQueryable中的Where方法如下所示:
public static IQueryable Where(this IQueryable source, string predicate, params object[] values)
{
if (source == null) throw new ArgumentNullException("source");
if (predicate == null) throw new ArgumentNullException("predicate");
LambdaExpression lambda = DynamicExpression.ParseLambda(source.ElementType, typeof(bool), predicate, values);
return source.Provider.CreateQuery(
Expression.Call(
typeof(Queryable), "Where",
new Type[] { source.ElementType },
source.Expression, Expression.Quote(lambda)));
}
谓词是过滤器“(iif ...)”作为字符串。