Asp.net Nhibernate查询如何使此查询使用异步?

Asp.net Nhibernate查询如何使此查询使用异步?,asp.net,asp.net-mvc,asynchronous,nhibernate,queryover,Asp.net,Asp.net Mvc,Asynchronous,Nhibernate,Queryover,对于这个新网站,我想在NHibernate中使用异步方法。我有一个使用QueryOverAPI的简单查询,但是我不能让这个查询与async一起工作 这是一个简单的查询,其中包含一些where子句,列出了所有业务。每次我执行这项任务时,我都要20个 查询: BusinessListItem bli = null; BusinessCategory bc = null; Category c = null; BusinessImage bi = null; Image i = null; var

对于这个新网站,我想在NHibernate中使用异步方法。我有一个使用QueryOverAPI的简单查询,但是我不能让这个查询与async一起工作

这是一个简单的查询,其中包含一些where子句,列出了所有业务。每次我执行这项任务时,我都要20个

查询:

BusinessListItem bli = null;
BusinessCategory bc = null;
Category c = null;
BusinessImage bi = null;
Image i = null;

var q = Session.QueryOver<Business>()
            .JoinAlias(x => x.Categories, () => bc)
            .JoinAlias(() => bc.Category, () => c)
            .JoinAlias(x => x.Images, () => bi, JoinType.LeftOuterJoin)
            .JoinAlias(() => bi.Image, () => i, JoinType.LeftOuterJoin)
            .Where(() => bc.IsMain);

        if (!string.IsNullOrEmpty(_name))
            q.WhereRestrictionOn(x => x.Name).IsLike($"%{_name}%");

        if (!string.IsNullOrEmpty(_streetName))
            q.WhereRestrictionOn(x => x.StreetName).IsLike($"%{_streetName}%");

        if (_categoryId != null)
            q.Where(() => c.Id == _categoryId.Value);

        if (_subCategoryIds != null)
            q.WhereRestrictionOn(() => c.Id).IsIn(_subCategoryIds);

        return q.Select(
                Projections.Property<Business>(x => x.Id).WithAlias(() => bli.Id),
                Projections.Property<Business>(x => x.Name).WithAlias(() => bli.Name),
                Projections.Property("c.Name").WithAlias(() => bli.CategoryName),
                Projections.Property("bi.Image").WithAlias(() => bli.Image)
            )
            .TransformUsing(Transformers.AliasToBean<BusinessListItem>())
            .List<BusinessListItem>()
            .OrderBy(x => x.Name)
            .Skip(_skipCount)
            .Take(20)
            .ToList();
BusinessListItem bli=null;
BusinessCategory bc=null;
c类=零;
BusinessImage bi=null;
图像i=空;
var q=Session.QueryOver()
.JoinAlias(x=>x.Categories,()=>bc)
.JoinAlias(()=>bc.Category,()=>c)
.JoinAlias(x=>x.Images,()=>bi,JoinType.LeftOuterJoin)
.JoinAlias(()=>bi.Image,()=>i,JoinType.LeftOuterJoin)
其中(()=>bc.IsMain);
如果(!string.IsNullOrEmpty(_name))
q、 其中restrictionon(x=>x.Name).IsLike($“%{u Name}%”);
如果(!string.IsNullOrEmpty(_streetName))
q、 其中restrictionon(x=>x.StreetName).IsLike($“%{u StreetName}%”);
如果(_categoryId!=null)
q、 式中(()=>c.Id==\u categoryId.Value);
如果(_subcategorids!=null)
q、 其中restrictionon(()=>c.Id).IsIn(_子类别Id);
返回q.选择(
Projections.Property(x=>x.Id).WithAlias(()=>bli.Id),
Projections.Property(x=>x.Name).WithAlias(()=>bli.Name),
Projections.Property(“c.Name”)。别名(()=>bli.CategoryName),
Projections.Property(“bi.Image”)。带别名(()=>bli.Image)
)
.TransformUsing(Transformers.AliasToBean())
.List()
.OrderBy(x=>x.Name)
.Skip(_skipCount)
.Take(20)
.ToList();
我知道方法.ListAsync()存在,但我无法让它与Skip、Take和OrderBy方法一起工作


非常感谢您的帮助

这个问题的解决方案是:

var result = await q.Select(
                Projections.Distinct(
                    Projections.Property<Business>(x => x.Id).WithAlias(() => bli.Id)
            )
            .TransformUsing(Transformers.AliasToBean<BusinessListItem>())
            .OrderBy(x => x.Name).Asc
            .Skip(_skipCount)
            .Take(_takeCount)
            .ListAsync<BusinessListItem>();

        return result.ToList();
var结果=等待q.选择(
投影,清晰(
Projections.Property(x=>x.Id).WithAlias(()=>bli.Id)
)
.TransformUsing(Transformers.AliasToBean())
.OrderBy(x=>x.Name).Asc
.Skip(_skipCount)
.Take(_takeCount)
.ListAsync();
返回result.ToList();

Thx到@DavidOsborne

为什么在结果具体化之前不合并您的订购和行限制?如果这样做,您应该能够使用
ListAsync()
method并获得一个可能更高效的查询。@DavidOsborne将结果具体化是什么意思?我不明白你在说什么。当你调用
List()时
NH将接受您的查询,构建SQL,然后运行它。如果您随后对返回的结果使用扩展方法(LINQ或其他方法),您将无法获得RDBMS可以提供的好处。当然,有时这是有意的。