具有投影和计数错误的NHibernate Linq查询

具有投影和计数错误的NHibernate Linq查询,nhibernate,iqueryable,linq-to-nhibernate,Nhibernate,Iqueryable,Linq To Nhibernate,我有以下疑问: 但是,如果我尝试获取计数,我会得到一个异常: 例外情况 NHibernate.Hql.Ast.ANTLR.QuerySyntaxException A recognition error occurred. [.Count[MyDto](.Select[MyClass,MyDto](NHibernate.Linq.NhQueryable`1[MyClass], Quote((domain, ) => (new MyDto()domain.Iddomain.Name.J

我有以下疑问:

但是,如果我尝试获取计数,我会得到一个异常:

例外情况

NHibernate.Hql.Ast.ANTLR.QuerySyntaxException

A recognition error occurred. [.Count[MyDto](.Select[MyClass,MyDto](NHibernate.Linq.NhQueryable`1[MyClass], Quote((domain, ) => (new MyDto()domain.Iddomain.Name.Join(p1, .Select[MyListClass,System.String](domain.MyList, (y, ) => (y.Name), ), ))), ), )]

如果不使用
ToList
,您知道如何解决这个问题吗?

关键是,我们不应该调用
Count()
过投影。所以这会起作用

var query = repositoy.Query<MyClass>;
var list = query.Select(domain => new MyDto()
{ 
    Id = domain.Id,
    StringComma = string.Join(",", domain.MyList.Select(y => y.Name))
});

var count = query.Count();

因此,对于Count-使用最简单的查询,即包含相同的联接和WHERE part

,如果您确实不需要结果,而只需要Count,那么您甚至不应该麻烦编写.Select()子句。Radim发布的答案是获取结果和计数的好方法,但如果您的数据库支持它,请使用将来的查询在到数据库的同一往返过程中执行这两种查询:

var query = repository.Query<MyClass>;
var list = query.Select(domain => new MyDto()
{ 
    Id = domain.Id,
    StringComma = string.Join(",", domain.MyList.Select(y => y.Name))
}).ToFuture();

var countFuture = query.Count().ToFutureValue();

int actualCount = countFuture.Value; //queries are actually executed here
var query=repository.query;
var list=query.Select(域=>newmydto()
{ 
Id=domain.Id,
StringComma=string.Join(“,”,domain.MyList.Select(y=>y.Name))
}).ToFuture();
var countFuture=query.Count().ToFutureValue();
int actualCount=countFuture.Value//查询实际上是在这里执行的

请注意,在NH 3.3.3之前的版本中,这仍然会执行两次往返(请参阅),但它会起作用,如果您升级NH,您将获得(轻微)性能提升。

谢谢。。。对我来说这听起来像个虫子。
NHibernate.Hql.Ast.ANTLR.QuerySyntaxException

A recognition error occurred. [.Count[MyDto](.Select[MyClass,MyDto](NHibernate.Linq.NhQueryable`1[MyClass], Quote((domain, ) => (new MyDto()domain.Iddomain.Name.Join(p1, .Select[MyListClass,System.String](domain.MyList, (y, ) => (y.Name), ), ))), ), )]
var query = repositoy.Query<MyClass>;
var list = query.Select(domain => new MyDto()
{ 
    Id = domain.Id,
    StringComma = string.Join(",", domain.MyList.Select(y => y.Name))
});

var count = query.Count();
var criteria = ... // criteria, with WHERE, SELECT, ORDER BY...

// HERE cleaned up, just to contain WHERE clause
var totalCountCriteria = CriteriaTransformer.TransformToRowCount(criteria);
var query = repository.Query<MyClass>;
var list = query.Select(domain => new MyDto()
{ 
    Id = domain.Id,
    StringComma = string.Join(",", domain.MyList.Select(y => y.Name))
}).ToFuture();

var countFuture = query.Count().ToFutureValue();

int actualCount = countFuture.Value; //queries are actually executed here