我有一个DbSet
对象DbSet<ShippingInformation> ShippingInformations;
,我也已为ShippingInformation覆盖了equals
运算符。
如何查找是否存在与对象x相等的ShippingInformations
集合中既存在的对象y,其类型均为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>>
)。关于c# - 查找对象是否存在于Dbset中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6905119/