8

理論的には同じ結果を返す2つの類似したクエリがあります。

var requestNotWorking = SessionManagement.Db.Linq<Item>(false).Where(i => 
                        i.Group != null && i.Group.Id == methodParameter)
                       .ToList();

このリクエストは、1つを返すことになっていますが、0のアイテムを返します。以下は後者を書き直したものですが、ToList()メソッドを呼び出しています。このリクエストは機能し、最初のクエリで期待されるアイテムを返します。

var requestWorking = SessionManagement.Db.Linq<Item>(false).ToList().Where(i => 
                     i.Group != null && i.Group.Id == methodParameter).ToList();

注:SessionManagement.Db.Linq<Item>(false)は、リクエストをキャッシュ(true)またはデータベース(false)のどちらで実行する必要があるかを決定するブール属性を持つ汎用のLinqtoNhibernateメソッドです。この方法は、ソリューションの他の多くの部分で正常に機能するため、おそらく問題はありません。アイテムのマッピングは特別なものではありません。バッグと次のパラメータはありません。 lazy="false" schema="dbo" mutable="false" polymorphism="explicit"

なんでそうなの?

編集

requestNoWorkingの生成されたSQL要求は、次で終了します。

(Item.Group_ID is not null) and Item.Group_ID=@p0',N'@p0 int',@p0=11768

requestWorkingの生成されたSQLリクエストは、おおよそselect * from dbo.Items

4

3 に答える 3

4

私はあなたがそこで行っているnhibernateセッションのものがクエリ可能なものを返すと仮定しています。その場合、最初のクエリの評価は.ToList()呼び出しまで延期され、クエリ全体がサーバー上で実行されます。可能であれば、SQLサーバーでトレースを実行するか、 NHProfをダウンロードして、実行されている実際のクエリが何であるかを確認することをお勧めします。

2番目のクエリは最初のクエリにヒットするとすぐに評価される.ToList()ため、テーブル全体をデータベースからプルバックし、.netを使用してフィルタリングします。正直なところ、評価が異なる理由はわかりませんが、マッピング/構成に何かがあり、dbクエリが少し間違って記述されていると思います。

于 2013-01-03T16:00:08.890 に答える
1

私はあなたの理論に非常に興味を持ってc.Group.Id != nullいました。それは私のソリューションの他のコードと矛盾していましたが、論理的であることがわかりました。ただし、削除しても何も変わりませんでした。mutable="false"プロパティを削除すると問題が解決することがわかりました。少し魔法のようですが、うまくいきました。

私が投稿したリクエストは、実際には更新/削除の可能性をチェックするメソッドで発生していました。私の結論は、アイテムを不変にすることで結果が失敗したということです。しかし、私が理解していないのは、なぜrequestWorkingが機能したのかということです。

于 2013-01-03T17:10:19.277 に答える
0

私が見ることができるのは、2番目のバージョンでWhereは、LINQ to NHibernateではなく、LINQtoObjectsによって実行されるということだけです。したがって、最初のバージョンは、LINQtoNHibernateがうまく消化できないことを実行する必要があります。

LINQ To NHibernateには問題があると思います。これは、の使用がCLR固有であることを示しています。空のフィールド値をテストするには、LINQtoNHibernateで別の構成を使用する必要がある場合があります。i.Group != nullnull

于 2013-01-03T15:59:58.790 に答える