Linq选择返回字符串而不是对象

8

I have the following code:

var languages = _languageService
            .GetAll()
            .Select(x => (((LanguageViewModel) new LanguageViewModel().InjectFrom(x))))
            .ToList();

执行此操作后,languages将变成预期的LanguageViewModel对象集合: Working 我想要做的是,在选择时将对象的Code属性也转换为大写,如下所示:
var languages = _languageService
            .GetAll()
            .Select(x => (((LanguageViewModel) new LanguageViewModel().InjectFrom(x)).Code = x.Code.ToUpper()))
            .ToList();

我希望 languages 对象中有多个 LanguageViewModel,但实际上它看起来像这样:

enter image description here

我猜测是因为我使用了类似于 Select(x => (new Object().Property = Value)) 的语句,它选择了 Property。但是,如何返回一个其中一个属性已更改的对象呢?在注入之前使用对象初始化程序不是选项,因为它将被覆盖,在注入之后使用它也不可能,因为它还没有被转换,所以我找到了这里的解决方案,但似乎不起作用。非常感谢任何建议。

你正在选择代码。考虑使用帮助方法来映射/格式化你的对象。 - ryanyuyu
1
你已经在使用 InjectFrom() 方法从 Language 实体映射到 LanguageViewModel。为什么不在映射方法中使用 this.Code = languge.Code.ToUpper() 呢?这正是视图模型的全部意义 - 它能够自适应视图的特定需求... - haim770
1
InjectFrom()是来自Omu.ValueInjecter的一个函数,它是一个专门用于值注入的NuGet包。改变它会不会是个好主意呢?我怀疑。。 - iuliu.net
2个回答

11

你无法将lambda的主体编写为单个表达式来完成所需的操作,但这并不是必须的。你可以在lambda中添加多个语句:

var languages = _languageService
    .GetAll()
    .Select(x => {
        var lvm = (LanguageViewModel)new LanguageViewModel().InjectFrom(x);
        lvm.Code = x.Code.ToUpper();
        return lvm;
    })
    .ToList();

1
如果您正在使用安全转换,请在继续之前还应检查lvm不为null。只是说... - Atlasmaybe
1
@Ed Plunkett 我的英文不太好,无法使用“轻微讨厌”的句子或制造“二度”的句子。我只是字面上说了我的评论。 ;) - Atlasmaybe
1
@haim770 这个例子可以编译和运行;如果它没有正确地说明我们正在讨论的原则,现在我们有了一个具体的代码示例,我们就可以找出我们互相之间的问题所在:https://dotnetfiddle.net/cbonlZ - 15ee8f99-57ff-4f92-890c-b56153
1
@EdPlunkett,抱歉,你是对的。我刚刚注意到我的代码有问题。 - haim770
1
“我希望有一种更省敲代码的方法。” ……好吧,你可以创建一个扩展方法T Apply<T>(this T @this, Action<T> a) { a(@this); return @this; },然后调用foo.Armpit.Apply(a => a.Limpet = 4)来获取已将其Limpet更改为4Armpit。这值得吗?我不知道。 - 31eee384
显示剩余8条评论

2

您的Select代码行可以重写为:

.Select(x =>
 {
  var vm = new LanguageViewModel().InjectFrom(x);
  vm.Code = vm.Code.ToUpper();
  return vm;
 })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接