Может ли нулевая проверка вызвать оценку на стороне клиента? - PullRequest
0 голосов
/ 04 апреля 2019

Я бы хотел спросить, почему такой запрос оценивается на стороне клиента:

_context
    .Items
    .Include(x => x.Status)

    .Include(x => x.Orders)
    .ThenInclude(x => x.User)

    .Include(x => x.Orders)
    .ThenInclude(x => x.OrderStatus)

    .Where(x => x.Orders.Any())
    .Where(x => x.Order != null)
    .Where(x => x.Order.User.SomeProperty.ToLower() == user.SomeProperty.ToLower());

, где пользователь, используемый в user.SomeProperty.ToLower(), является просто пользователем Identity и не равен нулю.

public class Item
{
    public Guid Id = { get; protected set; }

    public List<Order> Orders { get; set; } = new List<Order>();

    public Order Order => Orders.FirstOrDefault(x => x.OrderStatus.Name = "Active");

    public Status Status { get; set; }
}

public class Order
{
    public Guid Id = { get; protected set; }

    public User User = { get; set; }

    public Status OrderStatus = { get; set; }
}

public class Status
{
    public Guid Id = { get; protected set; }

    public string Name = { get; set; }
}

В предупреждениях EF Core говорится, что проверка нуля является одной из причин, но я не могу понять, почему проверка нуля не может быть переведена

warn: Microsoft.EntityFrameworkCore.Query [20500]Выражение LINQ 'where (Property ([x] .Order, "Id")! = Null) "не может быть переведено и будет оценено локально.

warn: Microsoft.EntityFrameworkCore.Query [20500] TheВыражение LINQ 'where ([x] .Order.User.SomeProperty == __ user_SomeProperty_0)' не может быть переведено и будет оценено локально.

1 Ответ

1 голос
/ 04 апреля 2019

EF не может перевести запрос в методы или свойства. Переместить это

public Order Order => Orders.FirstOrDefault(x => x.OrderStatus.Name = "Active");

К фактическому запросу

редактировать. Вы можете использовать методы расширения для повторного использования запросов вместо

edit2: создать метод расширения

public static class FooQueryExtensions
{
   public static IQueryable<FooResult> MyFooQuery(this IQueryable<Foo> source)
   {
      return source.SelectMany(...).Where(...); //basicly do what yuo want
   }
}

используется как

_context.Set<Foo>().MyFooQuery().Where(result => more query);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...