我正在通过实现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指令或程序集引用?)
关于如何实现这一点有什么想法吗?
这样的东西可以给你一个想法:
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();
}
来源:通用存储库:伪造IDbSet实现更新(查找方法和身份密钥)