Повторно используемые подзапросы в проекции - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь провести рефакторинг некоторого кода, где выполняется запрос, тогда два подзапроса находятся внутри проекции. Похоже:

from product in context.Product join ... join ... where ... select new ProductReturn() { ...., FileCount = (from ...), SomeOtherCount = (from ...) }

Раньше подзапросы выполнялись после запроса LINQ, в цикле (создание двух новых запросов SQL для каждого продукта), но я сложил их в выборку, которая отлично работала.

Но теперь я хочу извлечь, как FileCount и SomeOtherCount извлекаются в их собственные методы, чтобы мне не приходилось дублировать эти подзапросы везде.

Я скопировал запрос LINQ, создал новый метод, набрал return и вставил запрос. Мне нужно было добавить некоторые отсутствующие параметры, такие как продукт, контекст и точку с запятой.

Тогда моя новая проекция выглядит так: select new ProductReturn() { ...., FileCount = GetFileCount(context, product), SomeOtherCount = GetSomeOtherCount(context, product) });

Это прекрасно компилируется! Однако во время выполнения я получаю исключение: A second operation started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.

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

Можно ли добиться того, что я пытаюсь сделать, или мне нужно везде копировать и вставлять свои подзапросы?

Я пытался изменить свою подпись с private Expression<Func<Product, int>> GetFileCount(MyDbContext context, Product product) до private Expression<Func<Product, int>> GetFileCount(MyDbContext context, Product product), как я видел в некоторых местах во время поиска ответа, но GetFileCount даже не компилируется:

Cannot implicitly convert type 'System.Linq.Expressions.Expression<System.Func<Product, int>>' to 'int'

...