2

我正在通过实现 IDbSet 接口来实现 FakeDataSet 类。作为实现这个接口的一部分,我必须实现 Find 方法。我所有的实体类都有一个 Guid 类型 Id 列。我正在尝试为此 FakeDbSet 类实现 Find 方法,但很难以通用方式编写它。以下是我编写此方法的尝试。

public class FakeDataSet<T> : IDbSet<T> where T: class, new()  
{  
  //  Other methods for implementing  IDbSet interface
  public T Find(params object[] keyValues)  
  {  
       var keyValue = (Guid)keyValues.FirstOrDefault();
       return this.SingleOrDefault(m => m.Id == keyValue);  // How can I write this
  }
}

由于它不知道 Id 属于 Guid 类型,因此我在 m.Id 调用时遇到编译错误。

“T”不包含“Id”的定义,并且找不到接受“T”类型的第一个参数的扩展方法“Id”(您是否缺少 using 指令或程序集引用?)

关于如何实现这一点的任何想法?

4

1 回答 1

3

像这样给你一个想法:

public virtual T Find(params object[] keyValues)
{
    if (keyValues.Length != _keyProperties.Count)
        throw new ArgumentException("Incorrect number of keys passed to find method");

    IQueryable<T> keyQuery = this.AsQueryable<T>();

    for (int i = 0; i < keyValues.Length; i++)
    {
        var x = i; // nested linq

        keyQuery = keyQuery.
        Where(entity => _keyProperties[x].GetValue(entity, null).Equals(keyValues[x]));
    }

    return keyQuery.SingleOrDefault();
}

Source: Generic Repository: Fake IDbSet implementation update (Find Method & Identity key)

于 2012-10-08T03:49:48.660 回答