繁体   English   中英

通用 function 检查 DbSet 中是否存在值

[英]Generic function to check if value exists within DbSet

如果我的 dbContext 中有多个 dbSet,例如:

  • 公共 DbSet 人员 { 获取; 放; }
  • 公共 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM