Привязка запроса Linq с агрегатами к ListView WPF C # - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть класс "TimePunch", который записывает пары времени входа / выхода для каждого пользователя, а также уровень флага, который наследуется от INotify и имеет несколько открытых пулов get / return, которые будут упущены для простоты.

{
    private int ID;
    private string UserID = App.Username;
    private DateTime TimeIn;
    private DateTime TimeOut;
    private int Flag = 0; //0 = None, 1 = Manual, 2 = Edited, 3 = Unlikely, -1 = Deleted
    private string Notes;
...

Я связываю их набор в качестве основного источника для просмотра списка, и у меня есть несколько кнопок, которые действуют как вкладки, позволяющие менеджеру переключаться на день недели, на который они смотрят, и естьконтроль изменения даты выходных и фильтрации для каждого пользователя.Ладно, все хорошо и прекрасно.

Я хочу, чтобы второй listView был привязан к запросу, который показывает своего рода «Обзор» источника данных, суммируя часы, отработанные на сотрудника каждый день.(MyHoursView TimePunch возвращает десятичное число часов между TimeIn / TimeOut)

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

SELECT UserID, 
MAX(FlagView) As Flag, --'FlagView' ignores -1 or deleted records
SUM(CASE WHEN myTimeIn.DayofWeek = DayofWeek.Monday
    THEN myHoursView Else 0 END) As Monday, 
SUM(CASE WHEN myTimeIn.DayofWeek = DayofWeek.Tuesday  
    THEN myHoursView Else 0 END) As Tuesday,
...
SUM(myHoursView) As Total  
FROM PunchList  
WHERE TimeIn > WeekEnding.AddDays(-7) AND
   <= WeekEnding 
GROUP BY UserID

Есть ли способ чистосделать это в LINQ?

(Entity Framework не может быть и речи - в основном для совместимости)

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я думаю, вы хотите что-то вроде этого:

var result = yourlist.GroupBy(
                 item => item.UserId,
                 item => item.UserId,
                 (key, items) => new { UserId = key,
                                       flag = items.Any(x => x.flag),
                                       monday = items.Where(x => x.DayOfWeek == monday).Sum(x => x.myHoursView), 
 // etc.
0 голосов
/ 01 марта 2019

Эта рекомендация состоит в том, чтобы вместо этого использовать ADO.Net и вызвать хранимую процедуру, которая была настроена для возврата JSON из Azure / SQL Server.Затем десериализуйте JSON, возвращенный из sproc, в структуры / экземпляры, а затем привяжите к нужному списку.

  1. Создайте хранимую процедуру в базе данных Azure и верните соответствующий DTO / Model через For JSON Auto вконец выделения.
  2. Запустите sproc и извлеките пример данных JSON.
  3. Перейдите на JSON2CSharp и вставьте в JSON, чтобы создать объект DTO.
  4. Поместите класс в ваш проект.
  5. Поместите вызов sproc в ваш проект.Пример можно найти здесь на этой странице Nuget ядра .Net ( SQLJSONReader ).Страница
  6. Читатель этого проекта может быть найден SQLExtensions.cs , и его можно без проблем скопировать в ваш код .Net. Я написал пакет / код Nuget и еще не создал версию .Net ).
  7. Обратите внимание, что вы можете использовать Microsoft XmlReader, но она исключает JSON и не может обработать возврат данных из 2033 символов.
  8. В примере возвращается string, который будет необработанным JSON.Это необходимо будет десериализовать в ваш список.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...