我通过实现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指令或程序集引用?)
关于如何实现这一目标的任何想法?
答案 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)