Нужно преобразовать sql-запрос в linq и вернуть список записей

Hai, используя sql-запрос к своей рабочей стороне базы данных, напрямую не использовал базу данных, потому что это первый подход к коду. поэтому мне нужно преобразовать следующий запрос sql в запрос linq. пожалуйста, кто-нибудь предложит мне.

SELECT  Sy.SystemUserName,
    MIN(Sc.CreatedOn) as StartedTime,   
    MAX(Sc.CreatedOn) as ExitTime,
    datediff(MINUTE, 
    MIN(Sc.CreatedOn) , 
    MAX(Sc.CreatedOn)) as WorkingHours  
 from SystemDetails Sy   
 LEFT JOIN Screenshots Sc on Sy.id = Sc.SystemId   
 where Sy.CompanyGUID =  '25' 
 AND  Sy.IsDeleted = 0
 and (datediff(dd,Sc.CreatedOn,getdate()) = 0
 Or SC.CreatedOn IS NULL) 
 GROUP By Sy.SystemUserName   

Детали системы Модель:

 public class SystemDetails 
  {
    public int Id { get; set; }

    [Required]
    public string GuidID { get; set; }

   
    [Required]
    public string SystemUserName { get; set; }

  
    [Required]
    public string CompanyGUID { get; set; }

    [Required]
    public int TeamId { get; set; }

    public User User { get; set; }

    public ICollection<Screenshot> Screenshot { get; set; }
 

   }

Скриншот модели:

  public class Screenshot 
    {
    public int Id { get; set; }

    [Required]
    public string GuidId { get; set; }

    [Required]
    public int SystemId { get; set; }

    [Required]
    public string Screenshotname { get; set; }

    public DateTime CreatedOn { get; set; }

    public string CreatedBy { get; set; }

    public SystemDetails System { get; set; }

}

Класс возврата коллекции:

   public class UserAttendance
     {
    public string StaffName { get; set; }

    public DateTime StartTime { get; set; }

    public DateTime EndTime { get; set; }

    public string WorkingHours { get; set; }

     }

Здесь таблица SystemDetails Systemusername и таблица Screenshot Поля CreatedOn, которые нам нужны, поле SystemDeatils Id и поле Screenshot SystemId являются ключевыми ограничениями. Необходимо получить SystemUserName и минимальную дату CreatedOn в качестве StartTime, максимальную дату CreatedOn в качестве EndTime. мы получаем обе даты и времени как рабочие часы. мы получили все значения, используя ef core. Если дата CreatedOn равна нулю или нет доступной даты, тогда возвращается дата по умолчанию «1900-01-01». Пожалуйста, предложите мне

Что вы уже пробовали?

Svyatoslav Danyliv 22.03.2022 15:53

Возможно, мой Рецепт SQL для LINQ может вам помочь.

NetMage 22.03.2022 16:20

Какой LINQ вы используете: LINQ to SQL/EF 6.x/EF Core 2.0/2.1/3.x/5.x/6.x? Какой поставщик базы данных? Какие у вас классы/модели?

NetMage 22.03.2022 16:46

Мы используем EF 3.1, и две модели ниже перечислены => Модели SystemDetails являются общедоступными class SystemDetails { public int Id { get; набор; } [Обязательно] общедоступная строка GuidID { get; набор; } [Обязательно] общедоступная строка SystemIP { get; набор; } [Обязательно] общедоступная строка SystemUserName { get; набор; } [Обязательно] общедоступная строка CompanyGUID { get; набор; } [обязательно] public int TeamId { get; набор; } публичный пользователь Пользователь { получить; набор; } public ICollection<Screenshot> Screenshot { get; набор; } }

George 23.03.2022 06:16

Вот модели и возвращаемый класс коллекции: открытый класс UserAttendance { public string StaffName { get; набор; } общественный DateTime StartTime { получить; набор; } общественный DateTime EndTime { получить; набор; } общедоступная строка WorkHours { получить; набор; } }

George 23.03.2022 06:20

Модели скриншотов => открытый класс Screenshot { public int Id { get; набор; } [Обязательно] общедоступная строка GuidId { get; набор; } [обязательно] public int SystemId { get; набор; } [Требуется] общедоступная строка Screenshotname { get; набор; } общедоступная система SystemDetails { получить; набор; } общественный DateTime CreatedOn { получить; набор; } общедоступная строка CreatedBy { получить; набор; } }

George 23.03.2022 06:29

Обновите вопрос, а не комментарии. Вы пробовали использовать GroupBy?

Svyatoslav Danyliv 23.03.2022 09:33

ок сейчас обновлю. Да, я использую GroupBy

George 23.03.2022 10:51

Покажите свои попытки и какие проблемы у вас есть. Этот запрос легко перевести, и SO не является бесплатной службой перевода SQL в LINQ.

Svyatoslav Danyliv 23.03.2022 10:54

Да, я легко получаю все поля. я не знаю, как использовать функцию sql здесь. как MAX, MIN, DateDiff

George 23.03.2022 11:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте этот запрос:

var query = 
    from sy in dbContext.SystemDetails
    from sc in sy.Screenshot
    where sy.CompanyGUID == "25" && !sy.IsDeleted
       && (sc.CreatedOn == null || EF.Functions.DateDiffDay(sc.CreatedOn.Value, DateTime.Now) == 0)
    group sc by new { sc.SystemUserName } into g 
    select new UserAttendance
    {
        StaffName = g.Key.SystemUserName,
        StartTime = g.Min(x => x.CreatedOn.Value),
        EndTime = g.Max(x => x.CreatedOn.Value),
        WorkingHours = EF.Functions.DateDiffMinute(g.Min(x => x.CreatedOn.Value), g.Max(x => x.CreatedOn.Value)).ToString()
    };

Это работает нормально, сэр. Большое спасибо. здесь столкнулись с новой проблемой. в таблице systemdetails есть пять записей, в этих записях есть только 3 записи, скриншоты, созданные в поле значения даты и времени. другие 2 строки, созданные по значению поля, пусты. в этом сценарии необходимо пять записей, если создано пустое значение, а затем показать дату по умолчанию. сейчас создал на дату доступные 3 строки записи только пришли. но нужно пять рядов. Еще раз спасибо за ваши реплеи

George 23.03.2022 12:37

Другие вопросы по теме