首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq to SQL:查询不会查看挂起的更改

Linq to SQL:查询不会查看挂起的更改
EN

Stack Overflow用户
提问于 2009-10-30 20:11:39
回答 4查看 663关注 0票数 3

跟进this question。我有以下代码:

代码语言:javascript
复制
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,它就不会。

我可以让它查看挂起的更改以及表中已有的更改吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-10-30 20:29:52

我认为这在一般情况下是不可能的。假设您进行了如下查询:

代码语言:javascript
复制
dataContext.Users.InsertOnSubmit(new User { GroupId = 1 });
var groups = dataContext.Groups.Where(grp => grp.Users.Any());

数据库对新用户一无所知(到目前为止),因为插入还没有提交,所以生成的SQL查询可能不会返回Id = 1的组。在这种情况下,DataContext能够考虑尚未提交的插入的唯一方法是获取整个组-表(如果它们受查询影响,可能还有更多的表),并在客户机上执行查询,这当然是不可取的。我猜L2S设计者认为,如果一些查询考虑了尚未提交的插入,而其他查询不考虑,这是违反直觉的,所以他们选择永远不考虑它们。

为什么不使用像这样的东西呢?

代码语言:javascript
复制
foreach (var name in names.Distinct(StringComparer.InvariantCultureIgnoreCase))

在访问数据库之前过滤掉重复的名字?

票数 2
EN

Stack Overflow用户

发布于 2009-10-30 20:15:46

你为什么不试试这样的东西呢?

代码语言:javascript
复制
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;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2009-10-30 20:27:48

对不起,我不太了解LINQ to SQL。

但是,当我查看代码时,您似乎是在告诉它使用SubmitChanges一次性插入所有记录(类似于事务),并且您正在尝试从DB检查它的存在,而这些记录是而不是插入的。

编辑:尝试将SubmitChanges放入循环中,并查看代码是否会按照您的期望运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1649450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档