Nhibernate ICriteria - 检查属性值长度
我试图返回给定属性不为空的所有实体。 问题是IsNotEmpty()
只适用于集合。以下是我迄今为止采取的一般方法,显然不起作用。Nhibernate ICriteria - 检查属性值长度
ICriteria lvCriteria = NHibernateHelper.GetCurrentSession()
.CreateCriteria(typeof(FunctionCall))
.SetMaxResults(100)
.AddOrder(Order.Desc("LogId"));
if (pvMsg.HasValue)
{
lvCriteria.Add(Restrictions.IsNotNull("Msg"))
.Add(Restrictions.IsNotEmpty("Msg"));
}
有什么建议吗?是否可以通过检查属性值的长度来实现这个结果?谢谢!
最后,我发现了我正在寻找的组合!
lvCriteria.Add(Restrictions.Not(Expression.Eq("Msg", string.Empty)));
限制和表达式的组合按预期工作;缩小所有空串。我不知道为什么我甚至不能与实现这些结果早些时候:
lvCriteria.Add(Restrictions.Not(Restrictions.Eq("Msg", string.Empty)));
谢谢所有谁试过。
完美。我是NHibernate的新手,想知道为什么我不能像预期的那样执行'.IsNotEmpty',现在我知道了(我知道该怎么做)。干杯! – 2013-01-08 13:27:32
我相信你正在寻找:
.Add(Expression.IsNotEmpty("PropertyName"));
和
.Add(Expression.IsNotNull("PropertyName"));
其实这不是我正在寻找的。 IsNotEmpty()仅适用于集合(即行李箱,集合等)!如果我错了,请告诉我。我想检查每个实体的“消息”的值,并只返回有价值的人。相当于if(!string.IsNullOrEmpty(pvMsg)){...} – alan 2010-01-25 16:15:33
Expression.IsNotEmpty()与!string.IsNullOrEmpty()相同。 – hackerhasid 2010-01-26 16:01:05
请注意,我使用的是EXPRESSION类,而不是RESTRICTIONS类(就像您在帖子中所做的那样) – hackerhasid 2010-01-26 16:01:57
下面是我的映射和类的定义:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" assembly="Domain" namespace="Assembly.Domain">
<class name="Assembly.Domain.FunctionCall, Domain" lazy="false" table="FunctionCallLog">
<id name="LogId" column="LogId">
<generator class="native" />
</id>
<property name="LogTime" column="LogTime" />
<property name="Username" column="Username" />
<property name="CallerIp" column="CallerIp" />
<property name="FunctionName" column="FunctionName" />
<property name="Parameters" column="Parameters" />
<property name="Msg" column="Msg" />
<property name="FileName" column="FileName" />
<property name="TimeSpan" column="TimeSpan" />
</class>
</hibernate-mapping>
using System;
namespace Assembly.Domain
{
public class FunctionCall
{
public int LogId { get; set; }
public DateTime LogTime { get; set; }
public string Username { get; set; }
public string CallerIp { get; set; }
public string FunctionName { get; set; }
public string Parameters { get; set; }
public string Msg { get; set; }
public string FileName { get; set; }
public int TimeSpan { get; set; }
}
}
试试这个:
ICriteria lvCriteria = NHibernateHelper.GetCurrentSession()
.CreateCriteria(typeof(FunctionCall))
.SetMaxResults(100)
.AddOrder(Order.Desc("LogId"));
if (pvMsg.HasValue)
{
lvCriteria.Add(Restrictions.IsNotNull("Msg"))
.Add(Restrictions.Not(Restrictions.Eq("Msg", ""));
}
可能有更简洁的表达方式。
我试过,以及它不工作如预期。 我想我应该清楚,也许IsNotEmpty()不起作用,因为我需要应用此过滤器,因为集合正在填充;这是为了避免超时,因为此表包含1,000,000+条记录。 – alan 2010-02-08 22:02:24
你是什么意思“我需要应用此过滤器,因为集合正在填充”?如果查询超时,那么应该抓取由NH发布的SQL直接执行它并检查查询执行计划。 – 2010-02-08 23:10:00
由于返回的数据量而超时;它使用不合需要的数量的服务器内存。是不是可以说'只抓取Msg属性包含值的实体'而不是'抓取所有Msgs然后只返回那些Msg属性具有值'的实体? I.E.只从树上摘下好苹果,而不是挑选所有的苹果,然后扔掉坏的苹果? – alan 2010-02-09 23:01:23
我要么不理解你的代码,要么不明白什么是不工作的。你能提供一些样本输入数据和一些样本(预期与实际)输出吗? – 2010-01-23 11:23:04
消息只是一个文本字段,可以是空的,空的或包含一些值。我只想返回那些Msg属性包含一些值的实体“FunctionCall”。 IsNotEmpty()仅适用于集合,而不适用于单个实体。 (即,如果列表包含项目,则返回true,但如果在单个属性上使用则抛出异常)。 给定3个FunctionCall实体的属性Msg有3个单独的值“”,null和“ERROR”,我希望只有一个实体从我的查询返回,其中包含“ERROR”。 – alan 2010-01-25 14:19:33