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-比較Stringl.LetterType.ToString()"(ArgumentOutOfRangeException):インデックスが範囲外でした。負ではなく、コレクションのサイズ未満である必要があります。パラメータ名:インデックス、"エラー。

2- Enum( )自体の比較: 「(QueryException):NHibernate.Criterion.SimpleExpressionの型の不一致:LetterType期待される型System.Int32、実際の型Faraconesh.EnterpriseAppUnits.OfficeAutomation.BusinessEntities.LetterType、」エラーが発生するLetterTypeため、これも不可能です。l.LetterType == LetterType.Internal

3-比較対象: 「(NotImplementedException):メソッドToInt32が実装されていません。」エラーが発生するInt32ため、まだ不可能です。Convert.ToInt32(l.LetterType)

では、LINQ-to-NHibernateの列挙型をどのように比較できますか?この問題はLINQ-to-NHibernateに固有ですか、それともすべてのLINQユーザーがそのような問題を抱えていますか?

ここでのUPDATE2 は、クラス、列挙型、およびマッピング(要約)です。

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

=========

public enum 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クエリが機能します。

プロパティマッピングでは、名前とタイプを除くすべての属性がデフォルト値を指定しているため、不要であることに注意してください。「名前」は、プロパティマッピングで必要な唯一の属性です。リファレンスドキュメントのセクションプロパティを参照してください。

<property name="LetterType" />

nhforge.orgのNHibernateCoreダウンロードリンクから入手できる最新(2.1.2GA)バージョンのNHibernate.Linqを使用すると、列挙型を使用した次のクエリは期待どおりに機能します。

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.Valueを使用しようとするため、ltypeがnullの場合、この形式の最後のクエリは機能しません。

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

私があなたなら、これらのnhibernateEnumを使用してDotnet Enumを作成し、それらをdotnetequalsと比較します。

于 2010-02-27T08:34:11.357 に答える