[英]Generic function to check if value exists within DbSet
如果我的 dbContext 中有多个 dbSet,例如:
我怎么能创建一个通用的 function 来检查动态传递的字段的值是否已经出现?
Function 伪代码:
bool IsFieldValueUnique<T>(field, fieldValue)
{
return DbSet<T>.Any(x => x.field == fieldValue)
}
然后 function 调用可能类似于:
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
方法,它需要检查 function。 此检查 function 接受T
(与您在 DbSet 中使用的类型相同)并返回 boolean 值。
person => person.Email == somePersonObject.Email
is an anonymous function that for a given instance of a Person
compare the Email
property with somePersonObject.Email
.
如果您查看 Any 的签名,您将看到与 checkFunction 签名的相似之处。
如果您想在 Customer 上试用,您可以:
IsFieldValueUnique<Customer>(cust => person.Name == someCustomer.Name);
笔记:
像这样调用 Any: DbSet<T>.Any(checkFunction);
与此相同: DbSet<T>.Any(item => checkFunction(item));
bool IsFieldValueUnique<T>(Expression<Func<T, bool>> predicate)
{
return DbSet<T>.AsQueryable().Any(predicate.Compile());
}
And use it like this:
bool unique = IsFieldValueUnique<Person>(p => p.Email == something.Email);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.