我有一些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);
有人能给我一个更好的解决方案吗?
答案 0 :(得分:1)
我一般都讨厌存储过程,但probably
这是使用一个存储过程的完美案例。我的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);
答案 1 :(得分:0)