【问题标题】:How do optimize nested loop and filter from another list using linq c#如何使用linq c#优化嵌套循环并从另一个列表中过滤
【发布时间】:2021-10-16 13:59:45
【问题描述】:

我正在尝试过滤扁平嵌套循环并从另一个列表中过滤。所以下面是我能够做的。我尝试了这种方法,但是当我运行查询时,它不会在数据库中保存任何内容。我需要帮助来检查和忽略 Tasklist 表中的现有记录(相同的 MemberId 和 Description)。

var addedtop = from a in db.TaskLists select new {a.MemberId,a.Description};
var membtasks = from m in members
                        from n in tasks
                        select new { m, n };

       
        TaskList taskList = new TaskList();
        foreach (var item in membtasks)
        {
            var exist = db.TaskLists.Where(a => a.Description == item.n && a.MemberId == item.m);
            if(exist == null)
            {    
            taskList .Description = item.n;
            taskList .MemberId = item.m;
            db.taskList .Add(taskList );
            db.SaveChanges();

            }
       }
        return Redirect(url);

【问题讨论】:

  • 它不保存任何东西 - 您是否使用调试器来单步执行您的代码并查看它是如何工作的? Where 永远不会返回 null,这让我觉得你甚至没有尝试过调试这个..

标签: c# linq foreach asp.net-mvc-5


【解决方案1】:

问题是exists 永远不会是nullvar exist = db.TaskLists.Where(a => a.Description == item.n && a.MemberId == item.m); 行返回一个 IQueryable,它描述了您的查询,但尚未实际对数据库执行。

尝试将行更改为:

var exist = db.TaskLists.Where(a => a.Description == item.n && a.MemberId == item.m).SingleOrDefault();

这将执行查询并检查是否有单个项目满足您的查询。如果根本没有结果,则查询返回null,它将执行您的 if 语句中的代码。

【讨论】:

    【解决方案2】:

    您的语句尚未执行查询,您可以像这样将 Where to Any 更改为:

    var exist = db.TaskLists.Any(a => a.Description == item.n && a.MemberId == item.m);
    

    Any函数返回数据类型为bool

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 1970-01-01
      • 2021-02-06
      • 2015-05-29
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多