когда я использовал EF 2.2, он без проблем передавал этот код:
var resource = locResRepo.GetWhere(i => i.ForApplication.ToLower() == applicationName.ToLower())
.Where(resourcesConditionExpression)
.Select(item => new ResourceKeyObject
{
Id = item.Id,
ResourceKey = item.ResourceKey,
ResourceKeyValues = item.ActualLocalizationTranslation
.Where(translationConditionExpression)
.Select(v => new ResourceKeyValues
{
Language = v.Language,
KeyValue = v.Value
}).ToList()
}).ToList();
Но теперь выдает ошибку:
System.InvalidOperationException: Processing of the LINQ expression '(MaterializeCollectionNavigation(
navigation: Navigation: LocalizationResources.ActualLocalizationTranslation,
subquery: (NavigationExpansionExpression
Source: DbSet<ActualLocalizationTranslation>
.Where(a => EF.Property<Nullable<int>>(l, "Id") != null && EF.Property<Nullable<int>>(l, "Id") == EF.Property<Nullable<int>>(a, "ResourceId"))
PendingSelector: a => (NavigationTreeExpression
Value: (EntityReference: ActualLocalizationTranslation)
Expression: a)
)
.Where(i => EF.Property<Nullable<int>>((NavigationTreeExpression
Value: (EntityReference: LocalizationResources)
Expression: l), "Id") != null && EF.Property<Nullable<int>>((NavigationTreeExpression
Value: (EntityReference: LocalizationResources)
Expression: l), "Id") == EF.Property<Nullable<int>>(i, "ResourceId")))
.Where(t => True)' by 'NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.
at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor) and so on.....
И я действительно не понимаю, почему ... А может, я что-то знаю, но не знаю, как это реализовать
resourcesConditionExpression
иtranslationConditionExpression
? Я подозреваю, что они обращаются к локальным функциям или методам и поэтому не могут быть преобразованы в SQL. Кстати, этиToLower()
вызовы не нужны - сортировка базы данных обычно в чувствительна к регистру. Добавление этогоToLower()
испускаетLOWER()
вызовов, которые не позволяют оптимизатору запросов использовать индексы. - person Panagiotis Kanavos   schedule 30.01.2020.GroupBy
в правильное предложениеGROUP BY
. - person Panagiotis Kanavos   schedule 30.01.2020locResRepo
и чтоGetWhere
? В EF нетGetWhere
, поэтому мы действительно не знаем, что делает код - person Panagiotis Kanavos   schedule 30.01.2020ToList()
внутри запроса EF - это определенно то, что нельзя перевести, и отличный пример проблемы N + 1 - то, что было раньше, было выполнено по 1 дополнительному запросу для каждой записи во внешнем запрос. Для 100 внешних строк вы получите еще 100 запросов. - person Panagiotis Kanavos   schedule 30.01.2020from outer from inner where inner.SomeProp='x'
. EF Core пока не может фильтровать включенные объекты в форме связанного вызова. Отфильтрованные включения запланированы для EF Core 5.0. - person Panagiotis Kanavos   schedule 30.01.2020Id=ResourceId
никогда не будет соответствовать NULL-идентификаторам, поэтомуEF.Property<Nullable<int>>(l, "Id") != null
не требуется. Это сравнение подозрительно выглядит как попытка JOIN объектов, у которых нет необходимых отношений, иначе EF сам сгенерируетJOIN
для этих столбцов. И этоWhere(t=>true)
не будет сгенерировано EF - person Panagiotis Kanavos   schedule 30.01.2020