首页 > 解决方案 > C# 优化 Linq 查询:使用 where 更新

问题描述

我将如何优化以下查询?我们正在审查数据库中的实体框架查询,并尝试学习。

        using (var context = new DataDbContext())
        {
            var query = (from u in content.Parents
                         where u.Children.Any(y = y.Age > 13)
                         select u);

            foreach (var parent in query.ToList())
            {
                foreach (var children in owner.Children)
                {
                    children.IsTeenager= true;
                }
            }
            context.SaveChanges();
        }

标签: c#entity-frameworklinq.net-core.net-core-2.0

解决方案


没有很好的方法可以简化您在这里所做的事情。EF 倾向于将您推向从数据存储读取一堆数据、在本地更新实体然后将这些更改写回的路径。这显然很慢。但是,您在这里尝试做的是获取所有孩子并设置IsTeenager属性,这样您甚至都不关心Parent对象,您可以简单地这样做:

var children = context.Children.Where(c => c.Age < 13);

foreach(var child in children)
{
    child.IsTeenager = true;
}

context.SaveChanges();

当然,使用原始 SQL 有更简单的方法。例如:

context.Database.ExecuteSqlCommand("UPDATE Children SET IsTeenager = 1 WHERE Age < 13");

推荐阅读