跟进this question。我有以下代码:
string[] names = new[] { "Bob", "bob", "BoB" };
using (MyDataContext dataContext = new MyDataContext())
{
foreach (var name in names)
{
string s = name;
if (dataContext.Users.SingleOrDefault(u => u.Name.ToUpper() == s.ToUpper()) == null)
dataContext.Users.InsertOnSubmit(new User { Name = name });
}
dataContext.SubmitChanges();
}它插入所有三个名字( "bob“,”BoB“...and "BoB")。如果这是Linq-to-Objects,它就不会。
我可以让它查看挂起的更改以及表中已有的更改吗?
发布于 2009-10-30 20:29:52
我认为这在一般情况下是不可能的。假设您进行了如下查询:
dataContext.Users.InsertOnSubmit(new User { GroupId = 1 });
var groups = dataContext.Groups.Where(grp => grp.Users.Any());数据库对新用户一无所知(到目前为止),因为插入还没有提交,所以生成的SQL查询可能不会返回Id = 1的组。在这种情况下,DataContext能够考虑尚未提交的插入的唯一方法是获取整个组-表(如果它们受查询影响,可能还有更多的表),并在客户机上执行查询,这当然是不可取的。我猜L2S设计者认为,如果一些查询考虑了尚未提交的插入,而其他查询不考虑,这是违反直觉的,所以他们选择永远不考虑它们。
为什么不使用像这样的东西呢?
foreach (var name in names.Distinct(StringComparer.InvariantCultureIgnoreCase))在访问数据库之前过滤掉重复的名字?
发布于 2009-10-30 20:15:46
你为什么不试试这样的东西呢?
foreach (var name in names)
{
string s = name;
if (dataContext.Users.SingleOrDefault(u => u.Name.ToUpper() == s.ToUpper()) == null)
{
dataContext.Users.InsertOnSubmit(new User { Name = name });
break;
}
}发布于 2009-10-30 20:27:48
对不起,我不太了解LINQ to SQL。
但是,当我查看代码时,您似乎是在告诉它使用SubmitChanges一次性插入所有记录(类似于事务),并且您正在尝试从DB检查它的存在,而这些记录是而不是插入的。
编辑:尝试将SubmitChanges放入循环中,并查看代码是否会按照您的期望运行。
https://stackoverflow.com/questions/1649450
复制相似问题