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». Пожалуйста, предложите мне
Возможно, мой Рецепт SQL для LINQ может вам помочь.
Какой LINQ вы используете: LINQ to SQL/EF 6.x/EF Core 2.0/2.1/3.x/5.x/6.x? Какой поставщик базы данных? Какие у вас классы/модели?
Мы используем 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; набор; } }
Вот модели и возвращаемый класс коллекции: открытый класс UserAttendance { public string StaffName { get; набор; } общественный DateTime StartTime { получить; набор; } общественный DateTime EndTime { получить; набор; } общедоступная строка WorkHours { получить; набор; } }
Модели скриншотов => открытый класс Screenshot { public int Id { get; набор; } [Обязательно] общедоступная строка GuidId { get; набор; } [обязательно] public int SystemId { get; набор; } [Требуется] общедоступная строка Screenshotname { get; набор; } общедоступная система SystemDetails { получить; набор; } общественный DateTime CreatedOn { получить; набор; } общедоступная строка CreatedBy { получить; набор; } }
Обновите вопрос, а не комментарии. Вы пробовали использовать GroupBy
?
ок сейчас обновлю. Да, я использую GroupBy
Покажите свои попытки и какие проблемы у вас есть. Этот запрос легко перевести, и SO не является бесплатной службой перевода SQL в LINQ.
Да, я легко получаю все поля. я не знаю, как использовать функцию sql здесь. как MAX, MIN, DateDiff
Попробуйте этот запрос:
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 строки записи только пришли. но нужно пять рядов. Еще раз спасибо за ваши реплеи
Что вы уже пробовали?