8

我有一种情况,我想使用单个业务逻辑类对各种实体框架类执行类似的操作。我已经定义了一个接口,这些类在部分类文件中实现。

但是,当我尝试针对这些接口方法编写 LINQ 到实体查询时,我得到了 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();
    }
}
4

3 回答 3

6

这是不支持的。您的 Linq-to-entities 查询只能使用实体的映射属性。如果您使用接口属性,EF 不知道如何将它们转换为 SQL,因为它无法在属性实现中分析您的代码。

不要为实体使用接口 - EF 根本不支持它。在您的特殊情况下,它甚至无法与任何其他 ORM 一起使用,因为您正在查询映射未知的属性。这将需要您构建自己的 Linq 提供程序,将您的查询转换为具有真实映射属性的查询。

于 2012-02-17T10:45:04.637 回答
1

您可以使用动态查询库 ( 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);
        }
于 2013-08-02T12:11:13.590 回答
0

在基于通用源和 where 子句中使用的接口成员的查询执行期间发生以下异常。

NotSupportedException:不支持接口成员 [InterfaceName].[MemberName] 的映射。

仅当查询应返回多个项目并且我使用 == 运算符时才会发生异常。使用 First、FirstOrDefault 或 Single 执行查询时,或者在 where 子句中使用 equals 或其他运算符时,我无法重现该错误。

参考:不支持接口

于 2012-02-17T10:35:19.527 回答