一种通用的Find方法,用于通过Guid类型搜索实现IDbSet接口的类

时间:2012-10-08 03:36:12

标签: c# entity-framework entity-framework-4 dbcontext

我通过实现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'的定义,也没有扩展方法   可以找到'Id'接受类型'T'的第一个参数(是吗?   缺少using指令或程序集引用?)

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

1 个答案:

答案 0 :(得分: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();
}

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