Linq to DataSet, вложенная группа? - PullRequest
2 голосов
/ 08 ноября 2011

Я пытаюсь выполнить запрос Linq для таблицы данных, чтобы получить результат, отфильтрованный по пользователю, а затем по дате.Я следую примеру Group By - вложенный на странице примера Linq 101 здесь .

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

Это текущий нерабочий код, который я собрал из примера.

var results =
                 from d in dataTableResults.AsEnumerable()
                 select new 
                    { 
                        d["DIMS User"],
                        DateGroup =
                            from o in d["Entry Date"]
                            group o by o["Entry Date"] into dg
                            select new { "Entry Date" = dg.Key, "DIMS user" = dg}
                    };

Это моя структура DataTable: (Дата / Время отделены от синтаксического анализа ShortDateToString / ShortTimetoString)

LogData.Columns.Add("System User", typeof(string));
LogData.Columns.Add("Host Name", typeof(string));
LogData.Columns.Add("DIMS User", typeof(string));
LogData.Columns.Add("Entry Details", typeof(string));
LogData.Columns.Add("Asset Name", typeof(string));
LogData.Columns.Add("Entry Date", typeof(string));
LogData.Columns.Add("Entry Time", typeof(string));

Я получаю следующие ошибки:

1) Неверный анонимный член объявления типа.Члены анонимного типа должны быть объявлены с назначением члена, простым именем или доступом к члену.

2) Не удалось найти реализацию шаблона запроса для типа источника «объект».'GroupBy' не найден.

Наконец, спасибо за прочтение моего поста и заранее благодарим за помощь.

1 Ответ

3 голосов
/ 08 ноября 2011

Вы не можете определять имена свойств анонимных типов как строки:

Я определил два класса, чтобы собрать вашу информацию:

internal class Entry
{
    public string SystemUser { get; set; }
    public string HostName { get; set; }
    public string DIMSUser { get; set; }
    public string EntryDetails { get; set; }
    public string AssetName { get; set; }
    public string EntryDate { get; set; }
    public string EntryTime { get; set; }
}

internal class UserEntryPerDateInfo
{
    public string DIMSUser { get; set; }
    public string EntryDate { get; set; }
    public IEnumerable<Entry> EntryList { get; set; }
}

Здесь вы заполняете свои данные:

IEnumerable<Entry> dataList = from d in dataTableResults.AsEnumerable()
                              select new Entry
                                {
                                    SystemUser=d["SystemUser"],
                                    HostName=d["Host Name"],
                                    DIMSUser=d["DIMS User"],
                                    EntryDetails=d["Entry Details"],
                                    AssetName=d["Asset Name"],
                                    EntryDate=d["Entry Date"],
                                    EntryTime=d["Entry Time"],
                                };

Затем вы группируете по дате и пользователю и получаете их в другом классе:

IEnumerable<UserEntryPerDateInfo> result = from a in dataList
                                           group a by new {User = a.DIMSUser, EntryDate = a.EntryDate}
                                           into grouped
                                           select
                                           new UserEntryPerDateInfo
                                           {
                                               DIMSUser = grouped.Key.User,
                                               EntryDate = grouped.Key.EntryDate,
                                               EntryList = grouped
                                           };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...