查找数据库集中是否存在对象
本文关键字:存在 对象 是否 集中 数据库 查找 | 更新日期: 2023-09-27 18:04:06
我有一个DbSet
对象DbSet<ShippingInformation> ShippingInformations;
我也覆盖了ShippingInformation的equals
运算符。
我如何找到集合ShippingInformations
中是否有一个现有的对象y,它等于对象x,都是ShippingInformation
类型。
到目前为止,我已经尝试过:
storeDB.ShippingInformations.Contains(shippingInformation);
但是,这只适用于基本类型。
不幸的是,您不能在对EF的查询中使用Equals
实现,因为它不能反编译您的代码来查看它是如何完成的。使用Any
方法和谓词表达式应该没问题
bool exists = storeDB.ShippingInformations
.Any(info =>
info.CustomerID == other.CustomerID
&& info.CountryID == other.CountryID
);
(我制作字段只是为了展示这个想法,other
就是你要找的ShippingInformation
。(
如果有很多地方需要重用此表达式,您可能需要使用LinqKit来组合表达式:
private static Expression<Func<ShippingInformation, ShippingInformation, bool>>
isEqualExpr =
(info, other) =>
info.CustomerID == other.CustomerID
&& info.CountryID == other.CountryID;
// somewhere down this class
var expr = isEqualExpr; // reference the expression locally (required for LinqKit)
bool exists = storeDB.ShippingInformations
.Any(x => expr.Invoke(x, other)); // "injects" equality expression
这样的代码应该放在数据层中。
不过,我不能100%确定上面的代码是否有效EF很可能不允许在查询表达式中使用"其他"对象。如果是这种情况(请告诉我(,您将不得不修改表达式以接受所有基元类型值进行比较(在我们的示例中,它将变为Expression<Func<ShippingInformation, int, int, bool>>
(。
bool ifExists = storeDB.ShippingInformations.Any(shi=>shi.Id == objectYouWantToCompareTo.Id);
或者,如果覆盖等于运算符,这也应该有效。
bool ifExists = storeDB.ShippingInformations.Any(shi=>shi == objectYouWantToCompareTo);
试试这个:
storeDB.ShippingInformations.ToList().Contains(shippingInformation);
你可能还需要实现一个IEqualityComparer来获得你想要的东西。