【问题标题】:Linq - Merging two statements that use the same methodLinq - 合并使用相同方法的两个语句
【发布时间】: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 的类型为 ListList.ForEach 不是一个函数,而是一个过程——它不返回任何值,它的目的是在 lambda 中执行副作用。所以你正在修改ForEach 中的dbList,就像你有一个常规的foreach 循环一样——这将是一个更好的方法。 List.ForEach 很少是一个好主意。所以.ToList()var x = ForEach 毫无意义。

标签: c# linq foreach


【解决方案1】:

由于您的翻译方法在 LINQ 查询中不起作用,foreach 可能确实有用。试试这样:

void Main()
{
    var listOne = new List<dings>{
        new dings() {id = 1, name = "aaa"},
        new dings() {id = 2, name = "bbb"},
        new dings() {id = 3, name = "ccc"},
    };

    var listTwo = new List<bums>();
    foreach (var item in listOne)
    {
        listTwo.Add(
        new bums()
            {
                idbums = item.id + 33,
                namebums = item.name + "hoho"
            }
        );
    }
}

public class dings
{
    public int id;
    public string name;
}

public class bums
{
    public int idbums;
    public string namebums;
}

【讨论】:

    【解决方案2】:

    使用这样的连接:

        class Program
        {
            static void Main(string[] args)
            {
                DataBase _context = new DataBase();
    
                List<ProfileSections> localisedList = new List<ProfileSections>();
    
                var results = localisedList  
                               .Select(p => new
                               {
                                   Id = p.Id,
                                   Description = p.Description,
                                   InformationText = p.InformationText,
                                   TranslateDescription = p.TranslateDescription,
                                   TranslateInformationText = p.TranslateInformationText
                               }).ToList();
            }
        }
        public class DataBase
        {
            public List<ProfileSections> ProfileSections { get; set; }
        }
        public class ProfileSections
        {
            public int Id { get; set; }
            public string Description { get; set; }
            public string InformationText { get; set; }
    
            public string TranslateInformationText
            {
                get { return TranslateFunction(InformationText); }
                set { ;}
            }
    
            public string TranslateDescription
            {
                get { return TranslateFunction(Description); }
                set { ;}
            }
    
            private string TranslateFunction(string s)
            {
                return s;
            }
        }
    

    【讨论】:

    • 如果在示例中不清楚,请道歉 - .Translate() 是转换数据库中保存的 DescriptionInformationText 的值的方法。我基本上只是想在dbList的结果上运行这个方法
    • 我更新了代码,但不确定 localisedList 是否与 dbContext 类型相同。你可能想看看这个帖子:*.com/questions/20901419/…
    【解决方案3】:

    根本不要使用 ForEach。您可以在 LINQ Select 语句中一次性完成。至于你的错误:我想它来自dbList.ForEach,这是不正确的用法。

    void Main()
    {
        var listOne = new List<dings>{
            new dings() {id = 1, name = "aaa"},
            new dings() {id = 2, name = "bbb"},
            new dings() {id = 3, name = "ccc"},
        };
    
        var listTwo = listOne.Select(x => new bums() 
            {
                idbums = x.id + 33, 
                namebums = x.name + "hoho"
            }
        ).ToList();
    }
    
    public class dings{
        public int id;
        public string name;
    }
    
    public class bums
    {
        public int idbums;
        public string namebums;
    }
    

    【讨论】:

    • 然后如果我直接在dbList 中使用 Translate() 方法会出错 -- NotSupportedException: LINQ to Entities 无法识别方法 'System.String Translate(System.String) x27;方法,并且该方法不能翻译成商店表达式
    最近更新 更多