orderby - linq dynamic select




System.LINQ.Dynamic: выберите(«new(…)») в List<T>(или любую другую перечисляемую коллекцию<T>) (3)

Другой возможностью является расширение языка запросов DLinq с возможностью указывать имя типа в new предложении в строке запроса.

Я описал необходимость изменений в Dynamic.cs в другом ответе stackoverflow .

Это позволит вам ставить запросы, подобные следующим:

IQueryable<Result> res 
    = table1.AsQueryable()
    .GroupBy(groupbyvalue, "it")
    .Select("new Result(Key as Group, Sum(Value) as TotalValue)")
    as IQueryable<Result>;

Скажем, у меня есть DataTable с четырьмя столбцами, Company (строка), Fund (строка), State (строка), Value (double):

    table1.Rows.Add("Company 1","Fund 1","NY",100));
    table1.Rows.Add("Company 2","Fund 1","CA",200));
    table1.Rows.Add("Company 3","Fund 1","FL",300));
    table1.Rows.Add("Company 4","Fund 2","CA",400));
    table1.Rows.Add("Company 5","Fund 1","NY",500));
    table1.Rows.Add("Company 6","Fund 2","CA",600));
    table1.Rows.Add("Company 7","Fund 3","FL",700));

Я хочу использовать System.LINQ.Dynamic для создания динамического запроса, который группирует либо по Компании, Фонду или Штату, а затем выбирает мою группу по критериям в качестве первого столбца и сумму (значение):

string groupbyvalue="Fund";
var q1= table1.AsEnumerable().AsQueryable()
              .GroupBy(groupbyvalue,"it")
              .Select("new ("+groupbyvalue+" as Group, Sum(Value) as TotalValue)");

В приведенном выше запросе выбранное значение groupbyvalue (Group) всегда будет строкой, а сумма всегда будет двойной, поэтому я хочу иметь возможность привести что-то вроде List, где Result - это объект со свойствами Group (string). ) и TotalValue (двойной).

У меня много проблем с этим, может кто-нибудь пролить свет?


Другой, более простой способ сделать это - использовать сериализацию / десериализацию Json с помощью Newtonsoft.Json следующим образом:

Есть класс с нужными свойствами:

public class MyClass
{
    public string Group;

    public double Total;
}

После вашего запроса вы Json-сериализуетесь, а затем десериализуетесь к нужному типу данных:

string jsonData = JsonConvert.SerializeObject(q1);
List<MyClass> typedResult = JsonConvert.DeserializeObject<List<MyClass>>(jsonData);

Я вернул возвращенные данные в List <IExampleInterface> следующим образом:

1 Расширьте метод Select динамического linq для поддержки универсальных типов. Смотрите первый ответ here

2 Используйте метод Select (очень похоже на первую строку ответа dahlbyk)

Select<dynamic>("new (Key as Group, Sum(Value) as TotalValue)")

Если вам нужно несколько столбцов, вы можете использовать следующее:

GroupBy(@"new (Fund, Column1, Column2)", "it").
Select<dynamic>("new (Key.Fund, Key.Column1, Key.Column2, Sum(Value) as TotalValue)")

3 Конвертировать данные в список.

var data = ...
  GroupBy("...").Select<dynamic>("...").
  Cast<dynamic>().AsEnumerable().ToList();

4 Используйте Impromptu для преобразования списка в список <IExampleInterface>

var result = new List<IExampleInterface>();

foreach (var d in data)
{
  dynamic r = Impromptu.ActLike<IExampleInterface>(d);
  result.Add(r);
}