在存储库模式中按TKey查找实体<t,tkey =“”>

时间:2018-10-09 13:01:07

标签: c# repository-pattern generic-collections

对于Repository Pattern,我试图通过TKey查找一个实体。我正在尝试找到将TKeyint

进行比较的方法

实施

public interface IRepository<T, TKey>
{
    T GetById(TKey id);
}

public class Repository<T, TKey> : IRepository<T, TKey> where T : class, IEntity<TKey>
{
    private List<T> _context;

    public Repository(List<T> context)
    {
        _context = context;
    }

    public T GetById(TKey id)
    {
        return _context.Single(m => m.Id == (TKey)id);
    }
}

在这里,将int的{​​{1}}传递给

TKey

最后,测试客户端

public interface IEntity<TKey>
{
    TKey Id { get; set; }
}

public class TestEntity : IEntity<int>
{
    public int Id { get; set; }

    public string EntityName { get; set; }
}

我可能无法按照以下方式进行正确的转换,但尝试并运行时出现错误。

var list = new List<TestEntity>();

list.Add(new TestEntity{ Id = 1 , EntityName = "aaa" });
list.Add(new TestEntity{ Id = 2 , EntityName = "bbb" });

var repo = new Repository<TestEntity, int>(list);
var item = repo.GetById(1);

Console.WriteLine(item);
  

[System.InvalidOperationException:序列不包含匹配的元素]

如何在不将参数从public T GetById(TKey id) { return _context.Single(m => (object)m.Id == Convert.ChangeType(id, typeof(TKey)); } 更改为TKey id的情况下使用相同的方法实现

1 个答案:

答案 0 :(得分:2)

您不需要所有的转换,也绝对不需要字符串转换,因为首先TKey == TKey,其次,并不是所有基础存储库都可以应用这些转换。

您需要研究初始代码给出的实际编译器错误:

  

CS0019:运算符==不能应用于类型TKeyTKey的操作数

为了让C#知道它可以比较两个TKey,您需要将TKey约束为IEquatable<TKey>并调用.Equals()

public class Repository<T, TKey> : IRepository<T, TKey>
    where T : class, IEntity<TKey>
    where TKey : IEquatable<TKey>
{
    private List<T> _context;

    public Repository(List<T> context)
    {
        _context = context;
    }

    public T GetById(TKey id)
    {
        return _context.Single(m => m.Id.Equals(id));
    }
}