NHibernate Преобразование запроса в асинхронный запрос - PullRequest
0 голосов
/ 14 декабря 2018

Я смотрю на асинхронный просмотр некоторого нашего существующего кода.К сожалению, мой опыт работы с NHibernate отсутствует.Большая часть вещей NHibernate была легкой, учитывая, что NHibernate 5 имеет большую поддержку асинхронного.Я, однако, застрял.

Первоначально, мы делаем что-то подобное, используя нашу инъекцию зависимостей:

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;
    }

Это прекрасно работает для наших текущих применений.Мы пишем вещи таким образом, чтобы поддерживать контроль над нашими запросами, особенно связанные с более сложными объектами, гарантируя, что мы получим именно то, что нам нужно.

Я пробовал несколько вещей, например, заставить метод Query возвращать Task> и используя метод ToListAsync (), однако, поскольку я возвращаю его как список такого рода, я не могу запросить его.

Я уверен, что что-то пропустил.Если кто-нибудь может мне помочь, я был бы признателен.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Добавьте это using заявление в ваш файл

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();
}

Примечание: доступно только из NHibernate 5

Приложение: код, который вы используете в Repository.cs, можно упростить до следующего вида:

//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
}
0 голосов
/ 17 декабря 2018

В этом случае вам нужно использовать 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...