gpt4 book ai didi

c# - LINQ 除了获取所有行

转载 作者:行者123 更新时间:2023-11-30 15:17:27 24 4
gpt4 key购买 nike

我在包含数据库表对象的列表中使用 Except 方法,我有数据库中现有行的列表,以及来自应用程序的值列表,我必须检查这两个列表之间的增量要删除/插入到数据库,我使用 except,但它返回所有值。代码:

public void UpdatePoints(IEnumerable<TBL_Points> selectedPoints, int id)
{

List<TBL_Points> plistPointsFromDB = Context.TBL_Points.Where(x => x.Code == id).ToList();
List<TBL_Points> pRemoveItems = plistPointsFromDB .Except<TBL_Points>(selectedPoints.ToList()).ToList();
List<TBL_Points> pAddItems = selectedPoints.ToList().Except<TBL_Points>(plistPointsFromDB).ToList();
}

pRemoveItemsplistPointsFromDB 获取所有值,pAddItemsselectedPoints

获取所有值

最佳答案

CLR 引用类型的默认相等语义是按对象标识进行比较。除非两个引用引用同一个对象实例,否则它们被认为是不同的。

特别是在这种情况下,需要设置操作,我们可能需要自定义此行为,为我们的对象提供语义,而不是引用语义。

有多种方法可以实现这一点。我们可以在算法级别定义它,将自定义比较传递给 Except 方法。或者我们可以在类型级别定义它,为所讨论的集合元素类型的所有实例定义相等性。哪种方法最好将部分取决于对象的使用方式以及我们是否可以修改定义集合元素类型的类的源代码。

在他的回答中,Gilad Green 提供了有关这些方法的性质和用例的非常有用的 Microsoft 文档引用。

在下面的示例中,我们使用自定义比较器来定义相等性。

sealed class PointComparer: EqualityComparer<TBL_Points>
{
public override bool Equals(TBL_Points x, TBL_Points y) => x.Code == y.Code;

public override int GetHashCode(TBL_Points point) => point.Code.GetHashCode();
}

我们现在需要实例化这个比较器并将它传递给Except,就像这样

var pointsToAdd = selectedPoints
.AsEnumerable()
.Except(plistPointsFromDB, new PointComparer())
.ToList();

请注意,我清理了命名(除了类型本身的命名仍然很糟糕)并删除了不必要的显式类型使用。

另一种方法是为类型 TBL_Points 本身定义相等性(同样需要重命名)

class TBL_Points: IEquatable<TBL_Points>
{
public bool Equals(TBL_Points other) => Code == other?.Code;

public sealed override bool Equals(object obj) => obj is TBL_Points o && Equals(o);

public sealed override int GetHashCode() => Code.GetHashCode();

public static bool operator ==(TBL_Points x, TBL_Points y) => x?.Equals(y) == true;

public static bool operator !=(TBL_Points x, TBL_Points y) => !(x == y);
}

上面为该类型的所有使用定义了等式语义。这很方便,因为我们不再需要创建比较对象的实例并将其传递给算法。这也确保了所有用途的一致性。

关于c# - LINQ 除了获取所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46512238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com