查找数据库集中是否存在对象

本文关键字:存在 对象 是否 集中 数据库 查找 | 更新日期: 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来获得你想要的东西。