【发布时间】:2015-07-23 07:38:58
【问题描述】:
我有以下几点:
blocks.Where(x => x.BlockName == NAVIGATION)
.ForEach(block => block.Data = db.Pages.Select(x => x.Name).ToList());
如果where 找到多个块,我如何防止db.Pages.Select 对每个块执行数据库命中,而只需将List 重复用于第二个和后续块。
你可以在 lambda 函数中包含静态变量吗?
更新:如果where 发现零块,我根本不想执行提取。
更新:blocks 是一个内存列表
【问题讨论】:
-
blocks是从数据库加载的实体吗?无论如何,为什么不在开头写var names = db.Pages.Select(x => x.Name).ToList();,将其存储在变量中,然后在ForEach中使用变量? -
当然,你可以在(
var data = db.Pages.Select(x => x.Name).ToList())之前定义数据列表,然后在lambda里面使用:... .ForEach(block => block.Data = data); -
之前获取数据的问题是,如果
where发现零块,我根本不希望进行获取。 -
试试这个,然后:
IEnumerable<string> data = null; foreach (var block in blocks.where(...) { block.Data = data ?? (data = db.pages.select(x => x.name)); } -
var navigationBlocks = blocks.Where(x => x.BlockName == NAVIGATION).ToList(); if (navigationBlocks.Any()) { var data = db.Pages.Select(x => x.Name).ToList(); \\ and work with it }