Entity Framework比较两个数据集

Entity Framework compare two data sets

我有一种情况需要比较来自 Sql 服务器的两组数据。一组数据保存在 table 中(在我的 Entity Framework 模型中建模),但另一组数据是存储过程的结果集。 return 由存储过程编辑的字段与 table.

中的字段相同

我原以为以下方法可行:

using (var db = new MyDatabaseContext()) {
    DbSet<MyTable> tableData = db.MyTables;
    DbSet<MyTable> procData = db.Set<MyTable>();
    procData.AddRange(db.MyTables.SqlQuery("exec dbo.MyProc").ToList();

    if (tableData.Count != procData.Count) return false;

    foreach (var data in tableData) {
        if (!data.Equals(procData.Find(data.ID))) return false;
    }
}

(旁注:MyTable class 已被编辑以实现 IEquatable 并覆盖 Equals 因此它是 suitable 用于在字段级别进行比较)

逻辑是我相信 db.Set<MyTable> 会创建一个任意的空集 MyTable,我可以用存储过程的结果填充它,然后将其与table.

不过,我似乎误解了这一点,因为在第一个 if 行检查 tableDataprocData 的内容显示两者包含完全相同的数据(我'我特意编辑了存储过程,因此它不会 return 与 table 中的数据相同),这让我相信 db.Set<Table>db.MyTables 都引用了相同的东西。

我怎样才能做到这一点?

db.MyTables 与定义 procData 的行中返回的定义相同,并且最初包含相同的对象。

(我假设您的 DbContext 具有以下内容或等效内容):

public DbSet<MyTable> MyTables { get; set; }

调用 db.Set<MyTable>() 将为您提供一个与上下文中定义的 属性 等效的集合。

如果您只是在存储过程中进行过滤,那么 tableData 包含所有记录(procData 也是如此)。当您尝试添加更多记录(表面上是集合中包含的相同记录)时,EF will try and add the records with a state of "Added"。问题是,您的比较并未测试状态差异,并且 EF 可能不会考虑添加它们(如果您只是这样配置了主键,EF 可能会确定记录已经存在并且不需要更改状态)。