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

Posted

技术标签:

【中文标题】Linq选择返回字符串而不是对象【英文标题】:Linq select returning string instead of object 【发布时间】:2016-01-07 15:36:32 【问题描述】:

我有以下代码:

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

执行此操作时,languages 正如预期的那样成为LanguageViewModel 对象的集合:

我要做的是,在选择时,还将对象的Code 属性转换为大写,如下所示:

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

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

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

【问题讨论】:

您只选择了代码。考虑使用辅助方法来映射/格式化您的对象。 您已经使用InjectFrom() 方法从Language 实体映射LanguageViewModel。为什么不在映射方法中使用this.Code = languge.Code.ToUpper()?这就是视图模型的全部意义——它可以根据视图的特定需求进行自我调整...... InjectFrom() 是 Omu.ValueInjecter 中的一个函数,Omu.ValueInjecter 是一个专门用于值注入的 NuGet 包。改变它是个好主意吗?我怀疑它.. 【参考方案1】:

您不能将 lambda 主体编写为一个单独的表达式来执行您想要的操作,但您不需要这样做。您可以在 lambda 中放置多个语句:

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

【讨论】:

如果您使用安全强制转换,您还应该在继续之前检查lvm 是否不为空。只是说... @Ed Plunkett 我的英语不够好,无法使用“轻度讨厌”的句子,或制作“二级”句子。我只是在上面说我的评论。 ;) @haim770 这个例子编译运行;如果它不能正确地说明我们正在讨论的原理,现在我们已经有了一个具体的代码示例,我们可以弄清楚我们在哪里互相交谈:dotnetfiddle.net/cbonlZ @EdPlunkett,对不起,你是对的。我刚刚注意到我的代码有问题。 您好,InjectFrom() 实际上是一种使用反射读取调用对象类型的属性并返回Object 类型的对象的方法。你现在可以继续你的辩论。 :D【参考方案2】:

您的Select 行可以重写为

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

【讨论】:

以上是关于Linq选择返回字符串而不是对象的主要内容,如果未能解决你的问题,请参考以下文章

Symfony4 / Doctrine,如何选择“不同”的对象? getResult() 返回字符串数组,而不是对象数组

使用LINQ按字母顺序比较字符串

为啥编译器选择字符串而不是隐式字符数组的扩展方法?

Gson toJson 返回 JSON 字符串而不是 JSON 对象

jQuery Ajax 调用返回 JSON 字符串而不是对象数组

Linq:列表列表到长列表