Общий метод запроса в Entity Framework - PullRequest
2 голосов
/ 16 декабря 2011

В моей БД есть таблицы с атрибутом int DeleteState. Я хочу общий метод для запроса этих таблиц. Другими словами, метод, который делает это: Context.Table.Where(x => x.DeleteState == 0).

Я думал, что смогу сделать это:

public static class Extensions
{
  public static IQueryable<T> Exists<T>(this IQueryable<T> qry) where T : IDeletable
  {
    return qry.Where(x => x.DeleteState == 0);
  }
}

Где IDeletable это:

public interface IDeletable
{
    int DeleteState { get; set; }
}

Теперь мне нужно только добавить IDeletable в модель EF:

public partial class Table : EntityObject, IDeletable { ... }

Я сделал это с помощью механизма шаблонов.

К сожалению, это не работает :( Прекрасно компилируется, но выдает во время выполнения:

Unable to cast the type 'Table' to type 'IDeletable'. LINQ to Entities only supports casting Entity Data Model primitive types

если я назову это так:

Context.Table.Exists();

Как я могу решить эту проблему? Не могли бы вы придумать исправление или другой метод для достижения аналогичных результатов? Thx

Ответы [ 4 ]

0 голосов
/ 16 декабря 2011

Tsss, вот ответ: Метод универсального фильтра Linq Entity Framework

Я забыл про class здесь:

... гдеT: класс , IDeletable

0 голосов
/ 16 декабря 2011

Вы пытались преобразовать свои объекты в IDeletable перед тем, как на самом деле запросить?например,

public static IQueryable<T> Exists<T>(this IQueryable<T> qry)
{     
    return qry.Select<T, IDeletable>(x => x).Where(x => x.DeleteState == 0).Cast<T>();
}

Я не проверял этот код, однако ошибка звонит в звонок, и я помню, что я должен был сделать что-то подобное.

0 голосов
/ 16 декабря 2011

Может быть:

public static IQueryable<T> Exists<T>(this IQueryable<T> qry)
{
    return qry.Where(x => (!typeof(IDeletable).IsAssignableFrom(x.GetType()) || typeof(IDeletable).IsAssignableFrom(x.GetType()) && ((IDeletable)x).DeleteState == 0));
}
0 голосов
/ 16 декабря 2011

Проблема в том, что Entity Framework может работать только с деревом выражений.Ваша функция выполняет запрос напрямую вместо построения дерева выражений.

Более простым решением было бы добавить Определенную моделью функцию .

Можно вызвать определенную моделью функциюнепосредственно на экземпляр вашего контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...