我有一个DbSet
对象DbSet<ShippingInformation> ShippingInformations;
我还覆盖了ShippingInformation的equals
运算符。
如何在集合ShippingInformations
中找到等于对象x的集合ShippingInformation
中是否存在现有对象y。
到目前为止,我已经尝试过:
storeDB.ShippingInformations.Contains(shippingInformation);
但是,这仅适用于原始类型。
答案 0 :(得分:7)
很遗憾,您无法在对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>>
)。
答案 1 :(得分:1)
bool ifExists = storeDB.ShippingInformations.Any(shi=>shi.Id == objectYouWantToCompareTo.Id);
或者,如果覆盖equals运算符,这也应该有效。
bool ifExists = storeDB.ShippingInformations.Any(shi=>shi == objectYouWantToCompareTo);
答案 2 :(得分:1)
试试这个:
storeDB.ShippingInformations.ToList().Contains(shippingInformation);
您可能还需要实施IEqualityComparer才能获得您想要的内容。