Итак, у меня есть основной запрос синхронизации, например:
private List<MyCustomClass> Foo()
{
return _ctx.Table1.Where(...).Select(s => new MyCustomClass { ... }).ToList();
}
и мне нужно использовать его результаты в запросе синхронизации:
1. return Foo().Where(...).GroupBy(...).Select(s => new MyCustomClass2 { ... }).ToList();
ТАКЖЕ в асинхронном запросе:
2. return await Foo().Where(...).GroupBy(...).Select(s => new MyCustomClass3 { ... }).ToListAsync();
потому что мне нужно отфильтровать основные результаты запроса для других полей, а затем сгруппировать их и получить другую информацию.
Запрос (1) работает, а запрос (2) — нет (он даже не показывает .ToListAsync()). Я бы хотел оставить обе двери открытыми.
Я уже пытаюсь добавить AsQueryable() в основной запрос, но это не работает.
Кто-нибудь может мне помочь? Большое спасибо.
Короче говоря, использование IQueryable
включает как асинхронное, так и синхронное потребление:
private IQueryable<Table1> Foo()
{
IQueryable<Table1> query =_ctx.Table1.Where(...);
return query;
}
Затем, когда вы позвоните «Foo()»:
// synchronous code:
var results = Foo()
.Select(s => new MyCustomClass { ... });
.ToList();
// asynchronous code:
var results = await Foo()
.GroupBy(...)
.Select(s => new MyCustomClass3 { ... })
.ToListAsync();
Если вы хотите, чтобы у Foo() были базовые глобальные условия, но затем вызов, использующий эти результаты, хочет расширить условие Where, это нормально:
var results = await Foo()
.Where(... more conditions, will be ANDed to existing conditions ...)
.GroupBy(...)
.Select(s => new MyCustomClass3 { ... })
.ToListAsync();
Это обеспечивает максимальную гибкость и позволяет отложить выполнение IQueryable
. Вы можете использовать любую проекцию, какую хотите, жадно загружать связанные объекты, если вы этого хотите, получать счетчик или проверку существования с помощью .Any() и т. д. Очень мощный и приводит к эффективным запросам при правильном использовании.
Большое спасибо, я пытаюсь, но для асинхронного подзапроса у меня возникает ошибка: запрос blabla не может быть переведен. Мне нужно добавить AsEnumerable() или ToList() и т. д. но я не понимаю где мне нужно добавить AsEnumerable() или ToList(), чтобы все заработало.
"запрос блабла не может быть переведен" нужно указать точную ошибку
Хорошо, я исправил ошибку в запросе, теперь все работает нормально! Большое спасибо, Стив Пай.
Если вы хотите объединить запросы, верните
IQueryable
из функций и удалитеToList()
. материализация должна быть в конце.