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
行检查 tableData
和 procData
的内容显示两者包含完全相同的数据(我'我特意编辑了存储过程,因此它不会 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 可能会确定记录已经存在并且不需要更改状态)。
我有一种情况需要比较来自 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
行检查 tableData
和 procData
的内容显示两者包含完全相同的数据(我'我特意编辑了存储过程,因此它不会 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 可能会确定记录已经存在并且不需要更改状态)。