Sql server NHibernate将查询转换为异步查询
我正在研究异步化我们现有的一些代码。不幸的是,我对NHibernate缺乏经验。考虑到NHibernate 5对异步的大量支持,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
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
}