在LINQ-to-NHibernate或LINQ中比较枚举时是否有任何考虑?

时间:2010-02-27 07:19:29

标签: c# linq nhibernate linq-to-nhibernate

在这样的查询中:

var q = from l in session.Linq<Letter>()
    where
    letterTypeSearch == null ? true : 
        (l.LetterType.ToString() == letterTypeSearch)

l.LetterType是一个枚举。

更新 似乎无法比较当前linq-to-nhibernate中的Enums。虽然letterTypeSearch是一个包含LetterType实例并且ToString()继承自LetterType的字符串的字符串,但还有3种比较方法:

1-在int中进行比较:这是不可能的,因为String生成“(ArgumentOutOfRangeException):索引超出范围。必须是非负数且小于集合的大小。 参数名称:index,“error。

2-在l.LetterType.ToString()Enum)中进行比较:这也是不可能的,因为LetterType导致“(QueryException):NHibernate.Criterion.SimpleExpression中的类型不匹配:LetterType预期类型System.Int32,实际类型Faraconesh.EnterpriseAppUnits.OfficeAutomation.BusinessEntities.LetterType, “错误。

3-在l.LetterType == LetterType.Internal中进行比较:但不可能,因为Int32生成“(NotImplementedException):未实现ToInt32方法。”错误。

那么如何在LINQ-to-NHibernate中比较枚举?这个问题特定于LINQ-to-NHibernate还是所有LINQ用户都有这样的问题?

UPDATE2 这里是类,枚举和映射(smmarized):

Convert.ToInt32(l.LetterType)

======

public enum LetterType {     传入= 0,     传出= 1,     内部= 2, }

======

    public class Letter
    {
        private LetterType _letterType;
        public LetterType LetterType
        {
            set
            {
                _letterType = value;
            }//end  
            get
            {
                return _letterType;
            }//end  
        }
}

2 个答案:

答案 0 :(得分:1)

您已将枚举映射为type="int"导致错误,可能是因为没有与int之间的隐式转换。如果删除type属性,枚举将映射到数据库中的int值,Linq查询将起作用。

另请注意,在属性映射中,除了名称和类型之外的每个属性都是不必要的,因为它们指定了默认值。 “名称”是属性映射中唯一必需的属性,请参阅参考文档中的property部分。

<property name="LetterType" />

使用最新的(2.1.2GA)版本的NHibernate.Linq,可以从nhforge.org上的 NHibernate Core 下载链接获得,以下带枚举的查询按预期工作。< / p>

var q = from l in session.Linq<Letter>()
    where l. LetterType == LetterType.A4
    select l;
var result = q.ToList<Letter>();

LetterType? ltype = LetterType.A4;
q = from l in session.Linq<Letter>()
    select l;
if (code != null) {
    q = q.Where( l => l.LetterType == ltype.Value );
}
result = q.ToList<Letter>();

但是,如果ltype为null,则最后一个查询的这种形式将不起作用,因为查询解析器仍会尝试使用ltype.Value。

q = from l in session.Linq<Letter>()
    where ltype != null && l => l.LetterType == ltype.Value
    select l;
result = q.ToList<Letter>();

答案 1 :(得分:0)

如果我是你,我用这些nhibernate Enum创建一个Dot net Enum,然后将它们与dot net equals进行比较。