0

彼ら、

私はほとんどどこでも検索したこの問題を抱えています(多分私はそれのための正しいキーワードを知らないでしょう。)私はあなたの助けが必要です!

関係は非常に単純です。私には2つのActiverecordドメインがあります。チームとユーザーであり、それらは互いにHasAndBelongsToManyの関係にあります。

私の要件は、Team.Id = 4のユーザーの数を照会し、Team.Id=4のユーザーのリストを照会することです。

DetachedCriteria c = DetachedCriteria.For<Models.User>()
            .AddOrder(Order.Desc("RegisterTime"))
            .CreateAlias("Teams", "teams")
            .Add(Expression.Eq("teams.Id", 4));

int count = ActiveRecordMediator<Models.User>.Count(c);
IList<Models.User> users = Models.User.FindAll(c); 

カウントは正しく取得されますが、リストクエリの場合、例外が発生します。

Exception Details: System.InvalidCastException: At least one element in the source array could not be cast down to the destination array type.

別々に使うと。どちらも正しいです。しかし、私がそれらを次々に使用するとき。例外があります。これは、DetachedCriteriaを2つのクエリで密接に使用してはならないようなものです。何故ですか?

それを行う正しい方法は何ですか?

君の力が必要!

4

2 に答える 2

1

根本的な原因についてはまだはっきりしていませんが、それを行う方法を見つけましたが、次のようにコードを書くと正しくなり、見栄えも良くなります。

DetachedCriteria c = DetachedCriteria.For<Models.User>().AddOrder(Order.Desc("RegisterTime")).CreateAlias("Teams", "teams").Add(Expression.Eq("teams.Id", 4));
int count = ActiveRecordMediator<Models.User>.Count(NHibernate.CriteriaTransformer.TransformToRowCount(c));
IList<Models.User> users = Models.User.FindAll(c);

私はこのアプローチをここに置くためだけに自分の質問に答えましたが、これがそれに対する最良の答えであるかどうかはわかりません。

そして、私はこれについてもっと聞きたいです!

于 2011-07-19T03:31:34.600 に答える
0

私の賭けはActiveRecordMediator<Models.User>.Count(c);、2番目の呼び出しで例外が発生する予測で基準を変更することです。これを回避するには、各クエリの条件を複製します。

var clonedcrit = NHibernate.CriteriaTransformer.Clone(c)
于 2011-07-18T16:27:37.340 に答える