我有一些 C#/Linq 代码用于将 excel 文件中的数据合并到 db,这需要更好的性能。
有
1. 从 excel 文件中读取的列表:List<Score> newScoreList
2. 名为Scores
的数据库表, 主键 peopleId
和 testDate
我需要将列表中的数据合并到表中,如果有重复的数据,则更新。
我目前的解决方案是:
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/