我使用以下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 */
我想选择所有联系人属性。
最诚挚的问候,托马斯
答案 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/