【问题标题】:Using Linq to determine if a record does not exist in a list but does exist in a table使用Linq判断一条记录是否存在于列表中但存在于表中
【发布时间】:2014-04-22 03:13:07
【问题描述】:

我无法确定数据库表中是否存在记录,但列表中包含的更新记录中是否存在记录。如果更新列表中不存在该记录,但在数据库表中存在,则需要删除该记录。

我可以查询表以确定它是否已被修改,如果记录不存在于数据库表中,则更新它,但确定相反的情况证明有点棘手。另一个限制是我需要结果是一个布尔值 exists = true 和 not exist = false 以便我可以适当地处理记录的删除。

我这样做是为了确定数据库表中是否不存在该记录:

bool exists = db.table.Any(t => t.EntityID != list.EntityID)

但似乎无法管理反向。

列表和数据库表使用 Entity Framework 进行 1 对 1 映射。

如果记录存在于数据库中但不在列表中,则删除。

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    看起来你已经颠倒了那里的逻辑。如果要检查是否存在特定记录,其 ID 存储在 list.EntityID 中,如下所示:

    bool exists = db.table.Any(t => t.EntityID == list.EntityID);
    

    如果您有一个实体列表,并且想要查找数据库中存在但列表中不存在的任何记录,您可以执行以下操作:

    var extraitems = db.table.Where(t => !list.Select(l => l.EntityID).Contains(t.EntityID));
    

    这将为您提供可以传递给 DeleteAllOnSubmit() 的实体列表。

    【讨论】:

    • 如果您想查找任何“不”存在于数据库中但存在于列表中的记录怎么办?
    • @AnilPurswani 取决于。如果列表很小而表很大var extraitems = list.Where(l => !db.table.Select(t => t.EntityID).Contains(t.EntityID)); 应该这样做。如果列表很大而表很小,那么先从表中拉下 ID 可能会更快。
    • 只是对 Corey 评论的快速更正:最后一个“t.EntityID”应该是“l.EntityID” var extraitems = list.Where(l => !db.table.Select(t => t.EntityID).Contains(t.EntityID));
    • @DarrynFrost 之所以有效,是因为查询生成器将获取list.Select(l => l.EntityID) 的输出并将其转换为查询中的值列表。对于小型列表,您会获得相当好的结果。当列表很大并且在某些时候会完全失败时,它会变得很糟糕。
    • @DarrynFrost 您的方法针对列表中的每一行对数据库运行查询。这很慢。
    【解决方案2】:
    bool exists = db.table.Any(t => list.EntityID.Contains(t.EntityID))
    

    【讨论】:

    • 你能解释一下你的答案吗?目前还不完整。
    猜你喜欢
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多