c# - 如何通过查找器界面在 Entity Framework 4 中查找实体? (适用于 Linq To Sql)

标签 c# linq linq-to-sql entity-framework

我有一个存储库层,我的应用程序可以访问它,它可以用 IDataSource 初始化;例如LinqToSqlDataSource、EntityFrameworkDataSource 等...

IDataSource 分别提供了插入、更新、删除和查询数据源的方法。与这个问题相关的是 FindAll<T>返回 IQueryable<T> .

我所有的基础实体都实现了一个简单的接口(interface),使通过 id 查找实体变得通用和方便;

public interface IAmIdentifiable<T>
{
    T Id { get; set; }
}

下面是FindById<T, TKey>的相关代码我在 EntityFramework 中遇到问题的方法。

public class Repository
{
    public Repository(IDataSource dataSource)
    {...}

    public T FindById<T, TKey>(TKey identifier) where T : class, IAmIdentifiable<TKey>
    {
        return _DataSource.FindAll<T>().SingleOrDefault(i => i.Id.Equals(identifier));
    }

    ...
}

FindById<T, Tkey>(...) 适用于 LinqToSql,但不适用于 EntityFramework 4

示例用法

User user = Repository.FindById<User, int>(someUserId);
Message msg = Repository.FindById<Message, Guid>(someMessageId);

当使用 EntityFramework 4 IDataSource 实现运行上述代码时,它会产生以下错误;

无法创建“System.Object”类型的常量值。在此上下文中仅支持基本类型(“例如 Int32、String 和 Guid”)。

我曾尝试更改它以对值类型执行 == 比较。我读到将泛型约束为值类型的迂回方法是约束为 struct .我已经相应地更新了所有实体和存储库查找器的基本接口(interface)...

public interface IAmIdentifiable<T> where T : struct
{
    T Id { get; set; }
}

public T FindById<T, TKey>(TKey identifier)
    where T : class, IAmIdentifiable<TKey>
    where TKey : struct
{
    return _DataSource.FindAll<T>().SingleOrDefault(i => i.Id == identifier);
}

但是这仍然会导致编译错误;

错误 59 运算符 '==' 不能应用于 'TKey' 和 'TKey' 类型的操作数

任何人都可以阐明我如何将这些实体转换到 IAmIdentifiable<T> 中吗?接口(interface)以便有一个通用的方法来通过 Id 检索实体?

最佳答案

我认为错误在于您尝试比较 TKey 泛型的方式。由于 TKey 是复杂类型,因此必须显式实现 == 运算符才能进行此比较。现在使用 TKey 泛型,不能保证它是。也许您可以在 TKey 上放置另一个通用约束以确保有可用的比较方法?

关于c# - 如何通过查找器界面在 Entity Framework 4 中查找实体? (适用于 Linq To Sql),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4093592/

相关文章:

c# - 使用 Watin 更改 IE 实例的代理设置

c# - LINQ to SQL - 更新部分类中的数据上下文对象

c# - 将 LINQ-to-SQL 谓词组合成单个谓词

c# - 通用查找方法

c# - 为什么我的代码停止并且不返回异常?

c# - 在按匿名类型分组的 Entity Framework 查询中选择分组键最终会为每个分组对象返回一个键

c# - 如何在 LINQ 中通过索引连接两个集合

linq - .NET 3.5 Linq 数据源和连接

LINQ 连接错误

c# - 如何使用 DataTemplate 从 ItemsControl 获取 UIElement?