查找Dbset中是否存在对象

时间:2011-08-01 22:11:15

标签: c# .net linq

我有一个DbSet对象DbSet<ShippingInformation> ShippingInformations;我还覆盖了ShippingInformation的equals运算符。

如何在集合ShippingInformations中找到等于对象x的集合ShippingInformation中是否存在现有对象y。

到目前为止,我已经尝试过:

storeDB.ShippingInformations.Contains(shippingInformation);

但是,这仅适用于原始类型。

3 个答案:

答案 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才能获得您想要的内容。