如何使用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
永远不会是null
。 var 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 驱动程序中查询嵌套列表?