加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – LinqToSql奇怪的行为

发布时间:2020-12-15 23:51:48 所属栏目:百科 来源:网络整理
导读:我有以下代码: var tagToPosts = (from t2p in dataContext.TagToPosts join t in dataContext.Tags on t2p.TagId equals t.Id select new { t2p.Id,t.Name });//IQueryable tag2postsToDelete;foreach (Tag tag in tags){ Debug.WriteLine(tag); tagToPost
我有以下代码:

var tagToPosts = (from t2p in dataContext.TagToPosts
                                    join t in dataContext.Tags on t2p.TagId equals t.Id
                                    select new { t2p.Id,t.Name });
//IQueryable tag2postsToDelete;
foreach (Tag tag in tags)
{
    Debug.WriteLine(tag);
    tagToPosts = tagToPosts.Where(t => t.Name != tag.Name);
}
IQueryable tagToPostsToDelete = (from t2p in dataContext.TagToPosts
                                            join del in tagToPosts on t2p.Id equals del.Id
                                            select t2p);
dataContext.TagToPosts.DeleteAllOnSubmit(tagToPostsToDelete);

其中tags是List< Tag> – 构造函数创建的标记列表,因此它们没有id.
我运行代码将一个刹车点放在Debug上,然后等待几个周期.然后我将WatchToPosts.ToList()放在Watch窗口中以便执行查询.
在SQL事件探查器中,我可以看到以下查询:

exec sp_executesql N'SELECT [t0].[Id],[t1].[Name]
FROM [dbo].[tblTagToPost] AS [t0]
INNER JOIN [dbo].[tblTags] AS [t1] ON [t0].[TagId] = [t1].[Id]
WHERE ([t1].[Name]  @p0) AND ([t1].[Name]  @p1) AND ([t1].[Name]  @p2)',N'@p0 nvarchar(4),@p1 nvarchar(4),@p2 nvarchar(4)',@p0=N'tag3',@p1=N'tag3',@p2=N'tag3'

我们可以看到每个参数参数都具有循环中最后一个tag.Name的值.
你有没有想过如何获得这个和获得循环添加哪里有新的条件每个tyme?我可以看到IQueryable只在执行之前存储指向变量的指针.

解决方法

将你的foreach改为:

foreach (Tag tag in tags){
    var x = tag.Name;
    tagToPosts = tagToPosts.Where(t => t.Name != x);
}

这背后的原因是懒惰的评估和变量捕获.基本上,您在foreach语句中所做的事情并不是过滤掉可能看起来像的结果.您正在构建一个依赖于要执行的某些变量的表达式树.重要的是要注意实际变量是在表达式树中捕获的,而不是捕获时的值.由于每次都使用变量标记(并且它的范围是整个foreach,所以它不会在每次迭代结束时超出范围),它将被捕获用于表达式的每个部分,最后一个值将用于它的所有发生.解决方案是使用一个临时变量,该变量在foreach中作用域,因此它将在每次迭代时超出范围,并且在下一次迭代时,它将被视为一个新变量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读