实体框架比较两个数据集

时间:2015-04-22 15:24:40

标签: c# sql-server entity-framework stored-procedures

我有一种情况需要比较来自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行检查procDataif的内容显示两者都包含完全相同的数据(我有目的地编辑了存储过程,因此它不会返回与表中相同的数据),这使我相信db.Set<Table>db.MyTables都引用相同的东西。

我怎样才能做到这一点?

1 个答案:

答案 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可能会确定记录已经存在且状态更改是不必要的)。