我有一种情况需要比较来自Sql Server的两组数据。一组数据保存在表中(在我的实体框架模型中建模),但另一组是存储过程的结果集。存储过程返回的字段与表中的字段相同。
我原以为以下方法可行:
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
课程以实施IEquatable
并覆盖Equals
,因此适合在字段级进行比较)
我认为db.Set<MyTable>
的逻辑将创建一个任意空集MyTable
,我可以用存储过程的结果填充,然后将其与表中的数据进行比较。
然而,我似乎误解了这一点,因为在第一行tableData
行检查procData
和if
的内容显示两者都包含完全相同的数据(我有目的地编辑了存储过程,因此它不会返回与表中相同的数据),这使我相信db.Set<Table>
和db.MyTables
都引用相同的东西。
我怎样才能做到这一点?
答案 0 :(得分:1)
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可能会确定记录已经存在且状态更改是不必要的)。