例如,如果我的dbContext中有多个dbSet,则:
然后,如何创建通用函数来检查动态传递的字段的值是否已经出现?
伪代码中的功能:
bool IsFieldValueUnique<T>(field, fieldValue)
{
return DbSet<T>.Any(x => x.field == fieldValue)
}
然后函数调用可能类似于:
var result1 = IsFieldValueUnique<Person>(Person.Email, somePersonObject.Email)
var result2 = IsFieldValueUnique<Company>(Company.Identification, someCompanyObject.Identification)
在四处搜寻时,我发现使用'<Func <T,bool >>'之类的方法,但是无法将这些点连接在一起。
Func<T, bool>
-听起来像是您想要的正确方法。
bool IsFieldValueUnique<T>(Func<T, bool> checkFunction)
{
var alreadyExists = DbSet<T>.Any(checkFunction);
return !alreadyExists;
//Other ways to do this, but this is just for clarity.
}
然后您将其命名为:
IsFieldValueUnique<Person>(person => person.Email == somePersonObject.Email)
您现在拥有的是一种IsFieldValueUnique
具有检查功能的方法。此检查函数接受一个T
(与您在DbSet中使用的类型相同)并返回一个布尔值。
person => person.Email == somePersonObject.Email
是一个匿名函数,对于给定的Person
compareEmail
属性比较实例somePersonObject.Email
。
如果您查看Any的签名,您将看到与checkFunction签名的相似之处。
如果要在客户上试用,可以:
IsFieldValueUnique<Customer>(cust => person.Name == someCustomer.Name);
笔记:
像这样调用Any: DbSet<T>.Any(checkFunction);
与此相同: DbSet<T>.Any(item => checkFunction(item));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句