LINQ to Entities через интерфейс свойства - PullRequest
7 голосов
/ 17 февраля 2012

У меня есть ситуация, когда я хотел бы использовать один класс бизнес-логики для выполнения аналогичных операций с различными классами инфраструктуры сущностей.Я определил интерфейс, который эти классы реализуют в частичном файле классов.

Однако, когда я пытаюсь написать запрос LINQ to entity для этих методов интерфейса, я получаю NotSupportedException, поскольку запрос не использует свойства класса напрямуюно через интерфейс.

Я хотел бы сохранить тяжелый подъем на уровне базы данных, поэтому есть ли способ достичь этого, не прибегая к LINQ к объектам?

Вот некоторый код, который демонстрируетмоя проблема (он использует общий класс репозитория, созданный фабрикой).

public interface INamedEntity
{
    int ID { get; set; }
    string Name { get; set; }
}

// This is an Entity Framework class which has CustomerID and CustomerName properties.
public partial class Customer: INamedEntity
{
    int INamedEntity.ID
    {
        get { return this.CustomerID; }
        set { this.CustomerID = value; }
    }
    string INamedEntity.Name
    {
        get { return this.CustomerName; }
        set { this.CustomerName = value; }
    }
}

...

public string GetName<T>(int entityID) where T: EntityObject, INamedEntity
{
    using(var repository = RepositoryFactory.CreateRepository<T>())
    {
        return repository
            .Where(e => e.ID == entityID)
            .Select(e.Name)
            .Single();
    }
}

Ответы [ 3 ]

5 голосов
/ 17 февраля 2012

Это не поддерживается. Ваш запрос Linq-to-entity может использовать только сопоставленные свойства ваших сущностей. Если вы используете свойства интерфейса, EF не знает, как преобразовать их в SQL, потому что не может анализировать ваш код в реализации свойств.

Не используйте интерфейсы для сущностей - EF его вообще не поддерживает. В вашем особом случае он даже не будет работать с любым другим ORM, потому что вы запрашиваете свойства, неизвестные для сопоставления. Это потребует от вас создания собственного провайдера Linq, переводящего ваш запрос в запрос с реальными сопоставленными свойствами.

0 голосов
/ 02 августа 2013

Вы можете использовать динамическую библиотеку запросов (http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx).

        if (typeof (INamedEntity).IsAssignableFrom(typeof (T)))
        {
            q = q.Where("ID ==@0", id);
        }
0 голосов
/ 17 февраля 2012

Следующее исключение возникает во время выполнения запроса на основе универсального источника и с элементом интерфейса, используемым в предложении where.

NotSupportedException: отображение элемента интерфейса [InterfaceName]. [MemberName] не поддерживается.

Исключение возникает только тогда, когда запрос должен вернуть несколько элементов и когда я использовал оператор ==.Я не смог воспроизвести ошибку, когда выполнял запрос с First, FirstOrDefault или Single, или когда я использовал equals или другой оператор в предложении where.

Ссылка: Интерфейс не поддерживается

...