c# - 使用 Linq 合并来自两个来源的数据的更好方法

标签 c# sql linq

我有一些 C#/Linq 代码用于将 excel 文件中的数据合并到 db,这需要更好的性能。


1. 从 excel 文件中读取的列表:List<Score> newScoreList
2. 名为Scores 的数据库表, 主键 peopleIdtestDate

我需要将列表中的数据合并到表中,如果有重复的数据,则更新。

我目前的解决方案是:

1) 使用此 LINQ 表达式查找重复数据:

var dupliData =  
    from newScore in newScoreList  
    from oldScore in db.Scores  
    where newScore.peopleId == oldScore.peopleId && newScore.testDate == oldScore.testDate  
    select oldScore;  

2) 删除重复数据。

db.Scores.DeleteAllOnSubmit(dupliData); 

3) 从列表中插入新数据。

db.Scores.InsertAllOnSubmit(newScoreList);

谁能给我一个更好的解决方案?

最佳答案

一般来说,我真的很讨厌存储过程,但这可能是使用存储过程的完美案例。我的 TSQL 生锈了,但这应该可以提供一个想法。

CREATE PROCEDURE dbo.InsertOrUpdateScore
(
    @id as Int,
    @date as DateTime,
    @result as varchar(20)
)
AS

if not exists(SELECT id FROM Scores WHERE id = @id AND date = @date)
begin
   INSERT INTO Scores (id, date, result) values (@id, @date, @result)
end
else
begin
   UPDATE Scores
   SET result = @result
   WHERE id = @id AND date = @date
end
GO 

现在,在您的 LINQ 服务器浏览器中,选择 Score 实体,并更改其 INSERT 和 UPDATE 行为以使用您刚刚创建的存储过程。确保访问数据库的用户对 SPROC 具有 EXECUTE 权限。

这应该比您的版本执行得快很多。您正在为可能更快的指数交易 N 个 SELECT 的 IN 子句。但是,IN 子句的结果集不会通过网络传输回客户端,这可以节省相当多的时间。

在实现此方法之前准确分析您的方法所花费的时间,以便您可以判断这是否真的更快。

我不确定这是否是在您的应用程序中创建分数的唯一方法,但您可能需要考虑您正在插入尚无 ID 的记录的情况。您需要修改 SPROC 以允许 @id 作为 null,并适本地处理 INSERT。

那么它应该只是:

db.Scores.InsertAllOnSubmit(newScoreList);

关于c# - 使用 Linq 合并来自两个来源的数据的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5208943/

相关文章:

mysql - SQL - 显示表中的结果,而不显示另一个表中的值

c# - LINQ 查找没有连接的记录

c# - 在 DBQuery 中按匿名类型排序

c# - 使用 PostSharp,无法让 Multicast 为 WinForm 控件单击处理程序工作

c# - 如何在没有 Zeros 的情况下将 Oracle 数值获取到 .NET?

c# - 如何不序列化默认值

c# - 如何使用 LINQ lambda 组合多个列表

c# - 在托管 DLL 中加载 C++ DLL 时出现 EEFileLoadException

MySQL IN 与子查询性能奇怪的行为

sql - 是否可以选择子查询