具有Join和Distinct的QueryOver

时间:2011-05-25 16:46:37

标签: nhibernate join distinct queryover

我使用以下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 */

我想选择所有联系人属性。

最诚挚的问候,托马斯

3 个答案:

答案 0 :(得分: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转换器将其转换为您的对象。

答案 1 :(得分:0)

你没有预测接触的所有属性,应该是。我不知道是否有一个简短的方法来说“联系上的所有属性”或者你是否只需要一次做一个,但现在你只是说“不同的前100名searchterm.contactid”< / p>

答案 2 :(得分: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/