代码之家  ›  专栏  ›  技术社区  ›  Afshar Mohebi

在比较linq和nhibernate或linq中的枚举时有什么考虑吗?

  •  3
  • Afshar Mohebi  · 技术社区  · 14 年前

    在这种询问中:

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

    L.letterType是枚举。

    更新 似乎不可能将当前linq中的枚举与nhibernate进行比较。而lettertypesearch是一个包含 LetterType 实例是 ToString() 艾德 字母型 继承自 int ,有三种比较方法:

    1-比较 String :不可能,因为 l.LetterType.ToString() products“(argumentOutOfRangeException):索引超出范围。必须为非负且小于集合的大小。 参数名:index,“error。

    2-比较 Enum ( 字母型 )本身:这也是不可能的,因为 l.LetterType == LetterType.Internal 结果出现“(QueryException):nhibernate.Criteria.SimpleExpression中的类型不匹配:LetterType应为System.Int32类型,实际类型为Faraconesh.EnterpriseAppUnits.OfficeAutomation.BusinessEntities.LetterType, “错误。

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

    那么,如何将linq中的枚举与nhibernate进行比较呢?这个问题是linq-to-nhibernate特有的还是所有linq用户都有这样的问题?

    更新2 下面是类、枚举和映射(smmarized):

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

    不受欢迎的=

    公共枚举字母类型 { 传入=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>
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Lachlan Roche    14 年前

    您已将枚举映射为 type="int" 这会导致错误,可能是因为没有到int和从int的隐式转换。如果删除type属性,枚举将映射到数据库中的int值,并且linq查询将工作。

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

    <property name="LetterType" />
    

    使用最新(2.1.2ga)版本的nhibernate.linq,可从 NHibernate核 下载链接 nhforge.org ,以下枚举查询按预期工作。

    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为空,则最后一个查询的这种形式将不起作用,因为查询解析器仍将尝试使用ltype.value。

    q = from l in session.Linq<Letter>()
        where ltype != null && l => l.LetterType == ltype.Value
        select l;
    result = q.ToList<Letter>();
    
        2
  •  0
  •   Nasser Hadjloo    14 年前

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