2010-01-22 68 views
3

我试图返回给定属性不为空的所有实体。 问题是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")); 
} 

有什么建议吗?是否可以通过检查属性值的长度来实现这个结果?谢谢!

+0

我要么不理解你的代码,要么不明白什么是不工作的。你能提供一些样本输入数据和一些样本(预期与实际)输出吗? – 2010-01-23 11:23:04

+0

消息只是一个文本字段,可以是空的,空的或包含一些值。我只想返回那些Msg属性包含一些值的实体“FunctionCall”。 IsNotEmpty()仅适用于集合,而不适用于单个实体。 (即,如果列表包含项目,则返回true,但如果在单个属性上使用则抛出异常)。 给定3个FunctionCall实体的属性Msg有3个单独的值“”,null和“ERROR”,我希望只有一个实体从我的查询返回,其中包含“ERROR”。 – alan 2010-01-25 14:19:33

回答

4

最后,我发现了我正在寻找的组合!

lvCriteria.Add(Restrictions.Not(Expression.Eq("Msg", string.Empty))); 

限制和表达式的组合按预期工作;缩小所有空串。我不知道为什么我甚至不能与实现这些结果早些时候:

lvCriteria.Add(Restrictions.Not(Restrictions.Eq("Msg", string.Empty))); 

谢谢所有谁试过。

+0

完美。我是NHibernate的新手,想知道为什么我不能像预期的那样执行'.IsNotEmpty',现在我知道了(我知道该怎么做)。干杯! – 2013-01-08 13:27:32

0

我相信你正在寻找:

.Add(Expression.IsNotEmpty("PropertyName")); 

.Add(Expression.IsNotNull("PropertyName")); 
+1

其实这不是我正在寻找的。 IsNotEmpty()仅适用于集合(即行李箱,集合等)!如果我错了,请告诉我。我想检查每个实体的“消息”的值,并只返回有价值的人。相当于if(!string.IsNullOrEmpty(pvMsg)){...} – alan 2010-01-25 16:15:33

+0

Expression.IsNotEmpty()与!string.IsNullOrEmpty()相同。 – hackerhasid 2010-01-26 16:01:05

+0

请注意,我使用的是EXPRESSION类,而不是RESTRICTIONS类(就像您在帖子中所做的那样) – hackerhasid 2010-01-26 16:01:57

0

下面是我的映射和类的定义:

<?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; } 
    } 
} 
0

试试这个:

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", "")); 
} 

可能有更简洁的表达方式。

+0

我试过,以及它不工作如预期。 我想我应该清楚,也许IsNotEmpty()不起作用,因为我需要应用此过滤器,因为集合正在填充;这是为了避免超时,因为此表包含1,000,000+条记录。 – alan 2010-02-08 22:02:24

+0

你是什么意思“我需要应用此过滤器,因为集合正在填充”?如果查询超时,那么应该抓取由NH发布的SQL直接执行它并检查查询执行计划。 – 2010-02-08 23:10:00

+0

由于返回的数据量而超时;它使用不合需要的数量的服务器内存。是不是可以说'只抓取Msg属性包含值的实体'而不是'抓取所有Msgs然后只返回那些Msg属性具有值'的实体? I.E.只从树上摘下好苹果,而不是挑选所有的苹果,然后扔掉坏的苹果? – alan 2010-02-09 23:01:23