Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate 带连接和独立的查询覆盖_Nhibernate_Join_Distinct_Queryover - Fatal编程技术网

Nhibernate 带连接和独立的查询覆盖

Nhibernate 带连接和独立的查询覆盖,nhibernate,join,distinct,queryover,Nhibernate,Join,Distinct,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 =

我使用以下查询:

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);
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
但是我想要

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 */
我想选择联系人的所有属性


向你问好,托马斯,你并没有投射出接触的所有属性,应该是。我不知道是否有一种简单的方式来表示“联系人上的所有属性”,或者您是否只需要一次执行一个,但现在您只是说“distinct top 100 searchterm.contactid”

您必须明确指定要投影的所有列。据我所知,这是无法避免的

下面是我脑海中使用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);
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 transformer将其转换为您的对象。

此处列出的上一个代码对我没有帮助

我对此也有意见。首先,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();
//像往常一样创建查询。。应用标准。。你想干什么就干什么。
//从结果集中获取唯一的ID集。
var idList=query。
.选择(x=>x.Id)
.List().Distinct().ToList();
//在这些ID上进行分页
List pagedIds=idList.Skip(0.Take(10.ToList));
//这里过去是不明确的结果集,现在是。。
列出结果查询。其中(()=>
项目Id.IsIn(pagedIds))
.List()
.ToList();
特别感谢

不要忘记“OrderBy”,它对于不同的查询是必不可少的