繁体   English   中英

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

[英]Constructor Invocation using Dynamic Linq Select Expression

我正在使用Dynamic Linq

我可以执行以下操作:

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

这将创建一个包含匿名类型的IQueryable不是 IQueryable<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; }
}

我想通过调用ListItem的构造函数从IQueryable<Person>直接选择这种类型,该等效于以下内容:

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]()");

我相信可以从此处提供的文档中做到这一点

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

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

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

我不确定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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM