【问题标题】:How to update anonymous objects property using LINQ and Contains如何使用 LINQ 和 Contains 更新匿名对象属性
【发布时间】:2015-01-09 03:17:24
【问题描述】:

我有两个匿名对象列表如下

 var persons = people.Select(x => new { Name = x.Name, Year = x.Value });

 var years = yrs.Select(y => new { OldYear = y.Name, NewYear = y.Value });

现在我想更新人员列表,这样如果该人员的任何年份作为旧年份存在于年份列表中,则需要使用 NewYear 值更新年份属性。

这就是我目前的做法

 foreach(var p in persons)
                {
                    if(years.Any(a => a.OldYear == p.Year))
                    {
                        p.Year = ages.Single(a => a.OldYear == p.Year).NewYear;  --> error
                    }
                }

这不起作用,因为编译器抱怨我无法设置匿名类型的只读属性“年份”。

在 LINQ 中是否有更简单/更好的方法来根据一个 LINQ 语句中的另一个匿名列表更新人员列表?

【问题讨论】:

    标签: c# linq anonymous-types


    【解决方案1】:

    您可以执行进一步的选择:

    var people = from p in persons
        let year = ages.Any(a=>a.NewYear==p.Year) ? ages.Single(a => a.OldYear == p.Year).NewYear : p.Year
        select new { Name = p.Name, Year = year; };
    

    【讨论】:

    • 这会改变内存中的数据;它不允许更新数据库中的数据。
    • 但这只选择年龄存在于年龄列表中的人(顺便说一句,将 Q 更新为更清楚地称为年份)。但我也想从原始列表中选择所有年龄未包含在年龄列表中的人。你的陈述过滤了我不想要的人。
    • @MarcinZablocki 是的,如果有的话,我会否决这个答案。看起来它可能是查询数据库的 LINQ 查询。问题中明确说明了更新现有内容而不是创建新序列的具体提及,这将是对该要求的最有说服力的解释。
    • @Servy 好点,这也让我想到了一个问题——这是否可以使用匿名类型和 linq 来更新数据库?
    • @MarcinZablocki 如果他知道,是的。如果他不知道这一点,那么解决他的问题的方法就是不使用匿名类型。这就是答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多