3

在这样的查询中:

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

l.LetterType 是一个枚举。

更新 似乎不可能比较当前 linq-to-nhibernate 中的枚举。虽然 letterTypeSearch 是一个包含ed 且继承自的LetterType实例的字符串,但有 3 种比较方式:ToString()LetterTypeint

1-比较String:不可能,因为l.LetterType.ToString()产生“(ArgumentOutOfRangeException):索引超出范围。必须是非负数并且小于集合的大小。参数名称:索引,”错误。

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

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

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

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

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

=========

公共枚举 LetterType { 传入 = 0,传出 = 1,内部 = 2,}

=========

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false">
  <class
       name="Faraconesh.EnterpriseAppUnits.OfficeAutomation.BusinessEntities.Letter,Faraconesh.EnterpriseAppUnits.OfficeAutomation.BusinessEntities"
        table="OfficeAutomation_Letter">

    <property
         name="LetterType" column="LetterType"
         type="int" update="true" insert="true" access="property"
         not-null="true"/>

  </class>
</hibernate-mapping>
4

2 回答 2

1

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

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

<property name="LetterType" />

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

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>();
于 2010-02-27T11:12:49.723 回答
0

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

于 2010-02-27T08:34:11.357 回答