【发布时间】:2025-12-20 11:15:13
【问题描述】:
我正在尝试重写以下代码并将其集成到单个语句中:
所以不必这样做:
var dbList = await _context.ProfileSections.Select(p => new
{
p.Id,
p.Description,
p.InformationText
}).ToListAsync();
var localisedList = dbList.Select(p => new
{
p.Id,
Description = p.Description.Translate(),
Information = p.InformationText.Translate()
}).ToList();
如果我对模型进行强类型输入并使用 foreach,我假设我可以使用,例如:
var dbList = await _context.ProfileSections.Select(p => new ProfileSectionModel
{
p.Id,
p.Description,
p.InformationText
}).ToListAsync();
var localisedList = dbList.ForEach(l => {
l.Description = l.Description.Translate();
l.InformationText = l.InformationText.Translate();
}).ToList();
然后得到错误消息:Operator '.' cannot be applied to operand of type 'void'
那么有没有更容易结合这两个语句?或者我总是必须作为第一个返回anonymouse 类型。不确定处理此问题的正确方法是什么?
编辑
可以使用以下内容,但随后遇到了 EF 使用的动态代理的问题。我猜这就是它选择匿名类型的原因?
var dbList = await _context.ProfileSections.ToListAsync();
foreach (var item in dbList)
{
item.Description = item.Description.Translate(),
item.Information = item.InformationText.Translate()
}
【问题讨论】:
-
在新答案中查看新代码
-
“我正在尝试将以下代码重写并集成到单个语句中:” - 我想简洁有一个地方,但是 为什么 你在单个语句之后这里?这两个语句做了根本不同的事情——一个进入数据库,另一个只是做一些映射。仅仅因为它们具有相同的形状并不意味着它们必须粘在一起。 (顺便说一句,您的标题是指“2 foreach statements”,但我在这里看不到任何...)
-
dbList的类型为List。List.ForEach不是一个函数,而是一个过程——它不返回任何值,它的目的是在 lambda 中执行副作用。所以你正在修改ForEach中的dbList,就像你有一个常规的foreach循环一样——这将是一个更好的方法。List.ForEach很少是一个好主意。所以.ToList()和var x =对ForEach毫无意义。