C# Linq到Sql中的更新

C# Linq到Sql中的更新,c#,sql,linq,linq-to-sql,C#,Sql,Linq,Linq To Sql,用于更新记录,而不是查询上下文并单独更新每个记录, 我们目前使用的代码对现有行集执行DeleteAllOnSubmit,对新行集执行InsertAllOnSubmit。 这在我们的大多数场景中都很有效,因为如果插入/删除了同一行(内容),那么即使变更集中有insert和delete,它也会被删除。此外,如果主键相同,且记录的内容不同,则会将其转换为单个更新。我们遇到的问题是主键的匹配不区分大小写,比如说“abc”和“abc”,Linq认为它们是不同的键,然后尝试先运行Insert,然后运行del

用于更新记录,而不是查询上下文并单独更新每个记录, 我们目前使用的代码对现有行集执行DeleteAllOnSubmit,对新行集执行InsertAllOnSubmit。 这在我们的大多数场景中都很有效,因为如果插入/删除了同一行(内容),那么即使变更集中有insert和delete,它也会被删除。此外,如果主键相同,且记录的内容不同,则会将其转换为单个更新。我们遇到的问题是主键的匹配不区分大小写,比如说“abc”和“abc”,Linq认为它们是不同的键,然后尝试先运行Insert,然后运行delete,由于主键冲突而失败,因为对于我们的数据库设置,两个主键被认为是相等的。当Linq从变更集中的插入和删除确定更新时,有没有一种方法可以让它使用不区分大小写的比较

我知道另一种方法是查询数据库,如果记录存在,则执行更新而不是插入和删除。但是对于多个对象,我们有这样的逻辑,我们想看看是否还有其他可行的选择

谢谢你的回复

让我试着用一个例子来解释这个问题

假设我们有两张表,一家银行和一家分行,一家银行可以有多家分行

我们得到了一组需要在表中设置的分支。因此,逻辑是删除该银行的所有分行,并将其设置为我们拥有的分行集

我们现有的代码做了一些事情

DataContext dc = new DataContext();

var destBranches = dc.Branches.Where(b => b.BankID.Equals("123"));

dc.Users.DeleteAllOnSubmit(destBranches);
dc.Branches.InsertAllOnSubmit(branches);

如果我们使用更新路由,对于每个分支,我们必须查看它是否存在于dest中,然后修改其属性,如果不存在,则插入它,最后如果任何dest分支不在分支集中,则删除它。我们有很多表需要进行此更改。

如果您有SQL 2008,请使用MERGE语句进行查看。它一次执行更新/插入。SQL 2008的进程也接受表值参数,这将使它变得简单。

您也可以尝试。它为您完成所有批量更新的脏工作。

这个问题是关于LINQ到SQL,而不是SQL。原始SQL语句不太可能有用。@Timwi:考虑到LINQ to SQL可以执行存储过程,这似乎同样适用。有时,为了获得良好的性能,您必须跳出ORM。您是否总是在遇到诸如区分大小写之类的小问题时立即运行整个外部第三方库?没有,但自从我尝试PLINQO后,我再也没有使用基本LINQ2SQL。还有一些小原因,比如你的。。