【问题标题】:Constructor Invocation using Dynamic Linq Select Expression使用动态 Linq 选择表达式的构造函数调用
【发布时间】:2015-10-27 15:08:29
【问题描述】:

我正在使用Dynamic Linq

我可以做到以下几点:

IQueryable<Person>().Select("new(Id as Id, FirstName + Surname as Name");

这会创建一个包含匿名类型的IQueryable不是IQueryable&lt;object&gt;)。

但鉴于我有以下课程:

public class ListItem
{
    public ListItem()
    {
    }
    public ListItem(int id, string name)
    {
        this.Id = id;
        this.Name = name;
    }

    public int Id { get; set; }
    public string Name { get; set; }
}

我想通过调用ListItem的构造函数,直接从我的IQueryable&lt;Person&gt;中选择进入这个类型,相当于如下:

IQueryable<Person>().Select(p => new ListItem(p.Id, p.FirstName + p.Surname));

我尝试过以下变体:

// Illegal - new expects form "new()" - exception "'(' expected"
IQueryable<Person>().Select("new ListItem(Id, FirstName + Surname)");

// this doesn't work, "No property 'ListItem' exists on type 'Person'"
IQueryable<Person>().Select("ListItem(Id, FirstName + Surname)");

// this doesn't work because "[" is not expected
IQueryable<Person>().Select("[MyProject.Utils.ListItem,MyProject]()");

我相信这可以从文档available here:

方法、构造函数和索引器的重载解析使用类似于 C# 的规则。用非正式的术语来说,重载决策将选择最佳匹配方法、构造函数或索引器,或者如果无法识别单个最佳匹配,则报告歧义错误。

请注意,构造函数调用不以 new 为前缀。

这是可能的还是我误解了文档?

【问题讨论】:

  • 为什么要为此使用 DynamicLinq 而不仅仅是 LINQ?

标签: c# linq dynamic constructor invocation


【解决方案1】:

我不确定 Dynamic Linq 中的 Select 方法是否支持构造函数。也许文档说这仅支持谓词,例如Where 方法中使用的表达式。不过我不确定。

无论如何,这可能是您的解决方案:

var result =
    context
        .Customers
        .Select("new(Id as Id, FirstName + Surname as Name")
        .AsEnumerable()
        .Select(x => new ListItem(x.Id, x.Name))
        .ToList();

【讨论】:

  • 我用过类似的方法,但是由于第一个Select中的对象类型是动态生成的,所以不能参考x.Id。您需要改用 AutoMapper 之类的东西,例如.Select(x =&gt; AutoMapper.Mapper.DynamicMap&lt;ListItem&gt;()).
  • Select(...).AsEnumerable() 的结果是IEnumerable&lt;dynamic&gt;,也就是说你可以使用x.Id。你不会得到智能感知,但代码会正确编译和运行。在发布答案之前,我实际上已经尝试过了。
  • 哎呀!我忘记了dynamic。谢谢 - 我认为我的问题的答案是您必须执行显式转换步骤,并且动态 linq 默认情况下不支持实例化特定类型。
猜你喜欢
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 2019-10-22
相关资源
最近更新 更多