使用动态Linq选择表达式的构造函数调用

时间:2015-10-27 15:08:29

标签: c# linq dynamic constructor invocation

我正在使用Dynamic Linq

我可以做以下事情:

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

这会创建一个包含匿名类型的IQueryableIQueryable<object>)。

但鉴于我有以下课程:

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; }
}

我想通过调用IQueryable<Person>的构造函数从我的ListItem直接选择此类型,相当于以下内容:

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为前缀。

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

1 个答案:

答案 0 :(得分: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();