EF, абстракция и общие расширения, что здесь делает компилятор? - PullRequest
3 голосов
/ 21 февраля 2012

У меня есть метод расширения для общего интерфейса, используемого на моих объектах

public static IQueryable<T> IsEdited<T>(this IQueryable<T> source)
        where T : IAuditData
{
    return from o in source
           where o.CreatedOn != o.UpdatedOn
           select o;
}

когда я это называю

var editedUsers = dataContext.Users.IsEdited();

Я получаю

Невозможно привести тип IUserData к типу. 'IAuditData. LINQ to Entities only поддерживает приведение типов примитивов Entity Data Model

IUserData также является интерфейсом, я использую его для абстрагирования свойств DbContext DbSet

IQueryable<IUserData> Users { get { ... } }

но если я добавлю ограничение класса, все будет хорошо

public static IQueryable<T> IsEdited<T>(this IQueryable<T> source)
        where T : class, IAuditData
{
    return from o in source
           where o.CreatedOn != o.UpdatedOn
           select o;
}

что делает меня счастливым. Но что делает компилятор, чтобы сообщить EF, что T является ссылочным типом?

1 Ответ

3 голосов
/ 21 февраля 2012

struct тип не поддерживается EF . Если вы не ограничиваете параметр как класс, он также может быть структурой.

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