Я использую 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; }
}
Я хотел бы напрямую выбрать этот тип из моего 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]()");
Я считаю, что это возможно из документации, доступной здесь:
Разрешение перегрузки для методов, конструкторов и индексаторов использует правила, аналогичные C#. Говоря неформальными терминами, разрешение перегрузки выберет лучший метод сопоставления, конструктор или индексатор или сообщит об ошибке неоднозначности, если не может быть идентифицировано ни одного наилучшего совпадения.
Обратите внимание, что вызовы конструктора не имеют префикса new.
Возможно ли это, или я неправильно понял документацию?