Динамические значения linq и словарь - PullRequest
0 голосов
/ 13 октября 2019

Мне нужно сгруппировать записи из списка словарей, используя динамический linq. Словари основаны на возвращаемых полях для покупки SQL-запроса, а поля для группировки считываются из файла конфигурации, поэтому я использую строки в предложении GroupBy для имитации уже созданного предложения. Я могу получить группу и краткое изложение, в котором я нуждаюсь, но я не могу получить список со всей полной информацией. Когда я запускаю этот код, я получаю сообщение об ошибке: «Не существует подходящего индексатора в типе« IGrouping`2 »». Это происходит в поле «sign»:

var g = dicList.GroupBy("new(it[\"code\"] as Code, it[\"subcode\"] as Subcode)", "it").Select("new(Key.Code as Code,Key.Subcode as Subcode, it[\"sign\"] as Sign, Sum(Int32(it[\"value\"])) as Value)");

Это мой полный код:

    void CreateLists()
    {
    List<Dictionary<string, object>> dicList = new List<Dictionary<string, object>>();
    Dictionary<string, object> p0 = new Dictionary<string, object>();
    Dictionary<string, object> p1 = new Dictionary<string, object>();
    Dictionary<string, object> p2 = new Dictionary<string, object>();
    Dictionary<string, object> p3 = new Dictionary<string, object>();
    Dictionary<string, object> p4 = new Dictionary<string, object>();
    Dictionary<string, object> p5 = new Dictionary<string, object>();

        p0.Add("hash", Guid.NewGuid().ToString());
        p0.Add("code", 2123345);
        p0.Add("subcode", "CS23");
        p0.Add("sign", "AWR");
        p0.Add("value", 30);

        p3.Add("hash", Guid.NewGuid().ToString());
        p3.Add("code", 5003345);
        p3.Add("subcode", "CS32");
        p3.Add("sign", "AWR");
        p3.Add("value", 15);

        p1.Add("hash", Guid.NewGuid().ToString());
        p1.Add("code", 2123345);
        p1.Add("subcode", "CS23");
        p1.Add("sign", "AWR");
        p1.Add("value", 5);

        p2.Add("hash", Guid.NewGuid().ToString());
        p2.Add("code", 2123345);
        p2.Add("subcode", "CS23");
        p2.Add("sign", "AWR");
        p2.Add("value", 5);

        p5.Add("hash", Guid.NewGuid().ToString());
        p5.Add("code", 1213788);
        p5.Add("subcode", "CS12");
        p5.Add("sign", "AWR");
        p5.Add("value", 50);

        p4.Add("hash", Guid.NewGuid().ToString());
        p4.Add("code", 5003345);
        p4.Add("subcode", "CS43");
        p4.Add("sign", "AWR");
        p4.Add("value", 15);

        dicList.Add(padrao0);
        dicList.Add(padrao3);
        dicList.Add(padrao1);
        dicList.Add(padrao4);
        dicList.Add(padrao2);
        dicList.Add(padrao5);

        var g = dicList.GroupBy("new(it[\"code\"] as Code, it[\"subcode\"]      as Subcode)", "it").Select("new(Key.Code as Code,Key.Subcode as Subcode, it[\"sign\"] as Sign, Sum(Int32(it[\"value\"])) as Value)");

    }

Мне нужно вернуть ключи, поле для подписи и резюме. Как я могу это сделать?

1 Ответ

0 голосов
/ 13 октября 2019

Вот другая стратегия для моделирования ваших данных и группировки их по мере необходимости:

class MyThing // Give it a better name matching its purpose
{
  public string Hash { get; set; }
  public int Code { get; set; }
  public string Subcode { get; set; }
  public string Sign { get; set; }
  public int Value { get; set; }
}

List<MyThing> myThingList = new List<MyThing>();

myThingList.Add(new MyThing()
{
  Hash = Guid.NewGuid().ToString(),
  Code = 2123345,
  Subcode = "CS23",
  Sign = "AWR",
  Value = 30
});

myThingList.Add (new MyThing()
{
  Hash = Guid.NewGuid().ToString(),
  Code = 5003345,
  Subcode = "CS32",
  Sign = "AWR",
  Value = 15
});

myThingList.Add (new MyThing()
{
  Hash = Guid.NewGuid().ToString(),
  Code = 2123345,
  Subcode = "CS23",
  Sign = "AWR",
  Value = 5
});


myThingList.Add (new MyThing()
{
  Hash = Guid.NewGuid().ToString(),
  Code = 2123345,
  Subcode = "CS43",
  Sign = "AWR",
  Value = 15
});

var g = myThingList
.GroupBy(t => new { t.Code, t.Subcode });
// Select what you need from the group
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...