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

时间:2011-03-06 05:41:44

标签: 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);

有人能给我一个更好的解决方案吗?

2 个答案:

答案 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以允许@idnull,并适当地处理INSERT。

然后它应该只是:

db.Scores.InsertAllOnSubmit(newScoreList);

答案 1 :(得分:0)