7

次のQueryOverを使用します。

var query = searchTermRepository.GetAllOver()
     .Where(Restrictions.On<Entities.SearchTerm>(c => c.Text).IsLike(filter.Value, MatchMode.Start))
     .Select(Projections.Distinct(Projections.Property<Entities.SearchTerm>(x => x.Contact)))
     .Inner.JoinQueryOver(x => x.Contact).Take(100);

これにより、次のものが作成されます。

SELECT distinct TOP ( 100 /* @p0 */ ) this_.ContactId as y0_
FROM   SearchTerm this_
       inner join Contact contact1_
         on this_.ContactId = contact1_.Id
       left outer join Company contact1_1_
         on contact1_.Id = contact1_1_.Id
       left outer join Person contact1_2_
         on contact1_.Id = contact1_2_.Id
       left outer join Branch contact1_3_
         on contact1_.Id = contact1_3_.Id
       left outer join ContactGroup contact1_4_
         on contact1_.Id = contact1_4_.Id
WHERE  this_.Text like 'koc%%' /* @p1 */

でも私はしたい

SELECT distinct TOP ( 100 /* @p0 */ )  this_.ContactId as y0_, contact1_.*
FROM   SearchTerm this_
       inner join Contact contact1_
         on this_.ContactId = contact1_.Id
       left outer join Company contact1_1_
         on contact1_.Id = contact1_1_.Id
       left outer join Person contact1_2_
         on contact1_.Id = contact1_2_.Id
       left outer join Branch contact1_3_
         on contact1_.Id = contact1_3_.Id
       left outer join ContactGroup contact1_4_
         on contact1_.Id = contact1_4_.Id
WHERE  this_.Text like 'koc%%' /* @p1 */

連絡先のすべてのプロパティを選択したい。

よろしく、トーマス

4

3 に答える 3

9

投影するすべての列を明示的に指定する必要があります。私が知っているこれを回避する方法はありません。

QueryOverを使用する頭のてっぺんからの簡単なコードを次に示します。

Contact contact = null;

Session
.QueryOver(() => contact)
.SelectList(list => list
    .Select(Projections.Distinct(Projections.Property(x => x.Contact))) 
    .Select(c => c.Id).WithAlias(() => contact.Id)
    .Select(c => c.FirstName).WithAlias(() => contact.FirstName)
... and so on

次に、AliasToBeanトランスフォーマーを使用してこれをオブジェクトに変換する必要があります。

于 2011-05-25T17:11:27.297 に答える
0

あなたは連絡先のすべてのプロパティを投影することはありません。「連絡中のすべてのプロパティ」を簡単に言う方法があるのか​​、一度に1つずつ行う必要があるのか​​はわかりませんが、現在は「distinct top100searchterm.contactid」と言っているだけです。

于 2011-05-25T17:03:05.277 に答える
0

ここにリストされている以前のコードは私を助けませんでした。

これにも問題がありました。最初にDistinctは機能しますが、QueryOver.List.ToList()メソッドが呼び出された後でないと、query.skipが正しく機能せず、重複をページングしてリストを作成し、重複のためにページ数を減らします。 。

私が見つけた最も簡単なことは、最初に一意のIDのリストを作成してから、ID自体にページネーションを行うことでした。

次に、結果セットでIdを実行し、新しくページ付けされたid結果セットでのみIDを取得できます。

//Create your query as usual.. apply criteria.. do what ever you want.

//Get a unique set of ids from the result set.
var idList = query.
.Select(x => x.Id)
.List<long>().Distinct().ToList();

//Do your pagination here over those ids
List<long> pagedIds = idList.Skip(0).Take(10).ToList();

//Here what used to be non distinct resultset, now is..
List<T> resultquery.Where(() => 
item.Id.IsIn(pagedIds))
.List<Person>()
.ToList();

特別な感謝..https ://julianjelfs.wordpress.com/2009/04/03/nhibernate-removing-duplicates-combined-with-paging/

于 2017-05-31T09:24:25.050 に答える