linq эквивалент 'select *' sql для универсальной функции? - PullRequest
6 голосов
/ 21 сентября 2008

У меня есть общая функция <>, которая принимает запрос linq ('items') и перечисляет его, добавляя дополнительные свойства. Как я могу выбрать все свойства исходного «элемента», а не самого элемента (как делает код ниже)?

Таким образом, эквивалентно sql: выберите *, 'bar' как Foo из элементов

foreach (var item in items)
{
    var newItem = new {
        item, // I'd like just the properties here, not the 'item' object!
        Foo = "bar"
    };

    newItems.Add(newItem);
}

Ответы [ 5 ]

5 голосов
/ 21 сентября 2008

Нет простого способа сделать то, что вы предлагаете, так как все типы в C # строго типизированы, даже анонимные, как вы используете. Однако это не невозможно осуществить. Чтобы сделать это, вам нужно использовать отражение и создать свою собственную сборку в памяти, добавив новый модуль и тип, который содержит нужные вам свойства. Можно получить список свойств от вашего анонимного элемента, используя:

foreach(PropertyInfo info in item.GetType().GetProperties())
    Console.WriteLine("{0} = {1}", info.Name, info.GetValue(item, null));
3 голосов
/ 21 сентября 2008

Стреляй, ты написал именно то, что я собирался опубликовать. Я только готовил код: /

Это немного запутанно, но в любом случае:

ClientCollection coll = new ClientCollection();
var results = coll.Select(c =>
{
    Dictionary<string, object> objlist = new Dictionary<string, object>();
    foreach (PropertyInfo pi in c.GetType().GetProperties())
    {
        objlist.Add(pi.Name, pi.GetValue(c, null));
    }
    return new { someproperty = 1, propertyValues = objlist };
});
0 голосов
/ 19 сентября 2014

Предположим, у вас есть коллекция класса Department:

   public int DepartmentId { get; set; }
   public string DepartmentName { get; set; }

Затем используйте анонимный тип, подобный этому:

        List<DepartMent> depList = new List<DepartMent>();
        depList.Add(new DepartMent { DepartmentId = 1, DepartmentName = "Finance" });
        depList.Add(new DepartMent { DepartmentId = 2, DepartmentName = "HR" });
        depList.Add(new DepartMent { DepartmentId = 3, DepartmentName = "IT" });
        depList.Add(new DepartMent { DepartmentId = 4, DepartmentName = "Admin" });
        var result = from b in depList
                     select new {Id=b.DepartmentId,Damartment=b.DepartmentName,Foo="bar" };
0 голосов
/ 21 сентября 2008

Попросите предмет, чтобы дать их вам.

Отражение - это один из способов ... однако, поскольку все свойства известны во время компиляции, у каждого элемента может быть метод, который помогает этому запросу получить то, что ему нужно.

Вот несколько примеров сигнатур методов:

public XElement ToXElement()
public IEnumerable ToPropertyEnumerable()
public Dictionary<string, object> ToNameValuePairs()
0 голосов
/ 21 сентября 2008
from item in items
where someConditionOnItem
select
{
     propertyOne,
     propertyTwo
};
...