Sql server NHibernate将查询转换为异步查询

Sql server NHibernate将查询转换为异步查询,sql-server,linq,nhibernate,Sql Server,Linq,Nhibernate,我正在研究异步化我们现有的一些代码。不幸的是,我对NHibernate缺乏经验。考虑到NHibernate 5对异步的大量支持,NHibernate的大部分内容都很简单。然而,我被卡住了 最初,我们使用依赖项注入执行类似的操作: private readonly IRepository repository; public MovieRepository(IRepository repository) { this.repository = repository; } public

我正在研究异步化我们现有的一些代码。不幸的是,我对NHibernate缺乏经验。考虑到NHibernate 5对异步的大量支持,NHibernate的大部分内容都很简单。然而,我被卡住了

最初,我们使用依赖项注入执行类似的操作:

private readonly IRepository repository;

public MovieRepository(IRepository repository)
{
    this.repository = repository;
}

public Movie Get(int id)
{
    return (from movie in repository.Query<Movie>()
        select new Movie
        {
            ID = movie.ID,
            Title = movie.Title,
            Genre = new Genre
            {
                ID = movie.Genre.ID,
                Name = movie.Genre.Name,
            },
            MaleLead = movie.MaleLead,
            FemaleLead = movie.FemaleLead,
        }).FirstOrDefault();
    }

    //Repository Query method in Repository.cs
    public IQueryable<TEntity> Query<TEntity>() where TEntity : OurEntity
    {
        session = session.OpenSession();
        return from entity in session.Query<TEntity>() select entity;
    }
专用只读IRepository存储库;
公共电影存储库(IRepository存储库)
{
this.repository=存储库;
}
公共电影获取(int-id)
{
返回(来自repository.Query()中的电影)
选择新电影
{
ID=movie.ID,
标题=电影。标题,
流派=新流派
{
ID=movie.Genre.ID,
Name=movie.Genre.Name,
},
MaleLead=movie.MaleLead,
FemaleLead=movie.FemaleLead,
}).FirstOrDefault();
}
//Repository.cs中的存储库查询方法
公共IQueryable查询(),其中tenty:OurEntity
{
session=session.OpenSession();
从会话中的实体返回。Query()选择实体;
}
这对我们目前的使用非常有效。我们以这种方式编写东西是为了保持对查询的控制,特别是与更复杂的对象相关的查询,确保我们准确地返回所需的内容

我已经尝试了一些方法,比如让Query方法返回一个Task>和使用ToListAsync()方法,但是因为我返回的是那种类型的列表,所以我无法对它进行查询


我肯定我错过了什么。如果有人能帮助我,我将不胜感激。

在这种情况下,您需要使用
FirstOrDefaultAsync

public async Task<Movie> Get(int id)
{
    return await (from movie in repository.Query<Movie>()
        select new Movie
        {
            ID = movie.ID,
            Title = movie.Title,
            Genre = new Genre
            {
                ID = movie.Genre.ID,
                Name = movie.Genre.Name,
            },
            MaleLead = movie.MaleLead,
            FemaleLead = movie.FemaleLead,
        }).FirstOrDefaultAsync();
}
公共异步任务Get(int-id)
{
return wait(从存储库中的电影中)Query()返回
选择新电影
{
ID=movie.ID,
标题=电影。标题,
流派=新流派
{
ID=movie.Genre.ID,
Name=movie.Genre.Name,
},
MaleLead=movie.MaleLead,
FemaleLead=movie.FemaleLead,
}).FirstOrDefaultAsync();
}

使用语句将此
添加到您的文件中

using NHibernate.Linq;
然后您可以将方法更改为

public async Task<Movie> Get(int id)
{
    return await (from movie in repository.Query<Movie>()
        select new Movie
        {
            ID = movie.ID,
            Title = movie.Title,
            Genre = new Genre
            {
                ID = movie.Genre.ID,
                Name = movie.Genre.Name,
            },
            MaleLead = movie.MaleLead,
            FemaleLead = movie.FemaleLead,
        }).FirstOrDefaultAsync();
}

快速的google搜索告诉我FirstOrDefaultAsync是一个实体框架IQueryableExtension。这对我不起作用。不,这不是EF扩展。@Blankdud,这不是因为EF中存在某种东西,而是EF唯一的东西。。。如果您在代码中尝试了它,但没有找到它,那么您可能只是缺少了一个使用NHibernate.Linq的
//Repository Query method in Repository.cs
public IQueryable<TEntity> Query<TEntity>() where TEntity : OurEntity
{
    //session = session.OpenSession();  //this is obviously wrong, but it's beside the point
    var session = sessionFactory.OpenSession();
    return session.Query<TEntity>();  //the fix
}