如何使用linq c#优化嵌套循环并从另一个列表中过滤

Posted

技术标签:

【中文标题】如何使用linq c#优化嵌套循环并从另一个列表中过滤【英文标题】:How do optimize nested loop and filter from another list using 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,这让我觉得你甚至没有尝试过调试这个.. 【参考方案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

【讨论】:

以上是关于如何使用linq c#优化嵌套循环并从另一个列表中过滤的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Linq 在 Mongo C# 2.2 驱动程序中查询嵌套列表?

如何在 Linq C# 中使用嵌套字典对列表进行排序?

使用 LINQ 根据 C# 中的属性值搜索嵌套在另一个列表中的列表中的项目?

C# 减少嵌套循环

如何在 C# 中使用 LINQ 过滤嵌套字典?

如何使用LINQ从列表中获取重复项?