2010-01-22 69 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