我有一个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/

10-12 04:06