Поведение Strink Linq to Entities с AsExpandable ()

c# entity-framework-6 linq linqkit linq-to-entities

Вопрос

Рассмотрим следующее Person :

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Используя следующее Expression (построенное с использованием PredicateBuilder ) в качестве критерия:

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

При вызове с использованием следующего синтаксиса сгенерированный SQL в порядке (включает WHERE ):

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Однако при вызове с использованием этого немного другого синтаксиса SQL WHERE не задействован, и фильтрация выполняется Enumerable.Where вместо этого:

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Есть предположения?

Принятый ответ

Нет никакого неявного преобразования из группы методов в Expression (соответствующего типа делегата). Существует неявное преобразование из группы методов делегата согласующей подписи. Поэтому соответствует только перегрузка IEnumerable .

Конечно, это не значит, что вам нужно использовать лямбду. Просто пиши:

ctx.Set<Person>().AsExpandable().Where(ByName);

Поскольку вы передаете выражение ( ByName - это, в конце концов, Expression<Person, bool> уже, это именно то, что требуется Queryable.Where<Person> ), это будет оцениваться как запрос, а не в linq для объектов.




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему