как с помощью linq вернуть время в промежутке
Мне нужно отнять от даты последнего визита дату регистрации.
var livespan = DB.Users.Where(x => x.DateRegistration - x.DateLastVisit);
я пытался сделать что то такое, но это ошибочно
у меня есть дата регистрации и дата последнего визита, лишь нужно найти между ними разницу и вернуть неё
public DateTime DateRegistration { get; set; } public DateTime DateLastVisit { get; set; }
Например время в промежутке от даты регистрации до даты последнего визита.
какой оператор используется, для того, чтобы рассчитать именно промежуток времени?
например Where(DateRegrstration Between DateLastVisit)
Я выполняю запрос через лямбду:
DB.Users.Where(x=>x.DateLastVisit && c.DateRegistration);
но & нельзя использовать
Ответы (3 шт):
Если я правильно понял задачу:
.Where(x => x > DateRegistration && x > DateLastVisit)
Просто понимаете в чём проблема? Невозможно, чтобы DateLastVisit была больше чем дата регистрации: сначала регистрируемся, потом заходим.
Во-вторых, у вас всегда будет две даты, скажем, дата последнего визита и DateTime.Now.
Так что надо уточнить, что за даты, но в любом случае, у вас есть Date1 и Date2:
.Where(x => x > Date1 && x < Date2)
типо нужно как то отнять от даты ласт визита дату регистрации чтобы понять вемя продолжительности жизни юзера
Интервалы - это тип TimeSpan, он делается очень просто и без linq:
TimeSpan userLifetime = DateTime.Now - DateRegistration;
И у типа TimeSpan есть множество вариантов методов https://docs.microsoft.com/ru-ru/dotnet/api/system.timespan.minutes?view=netframework-4.8 - например TimeSpan.Hours или TimeSpan.Minutes или те же самые функции с префиксом Total
Да, но мне нужно узнать разницу именно от готового юзера, ведь данные о юзере хранятся в бд, и чтобы получить к ним доступ мне нужно использовать LINQ.
@theacidday Ну вот и смотрите, у вас у пользователя в БД есть два параметра: DateRegistration и DateLastVisit причём второе больше первого и оба меньше DateTime.Now. И что вы хотите за выборку? "Пользователи у которых дата регистрации меньше даты последнего визита"? Наивно. "Пользователи у которых дата последнего захода меньше чем сейчас"? Наивно. Как ни крути, у вас нет ДВУХ дат, а значит, нет ИНТЕРВАЛА ДАТ.
Вам нужно сфомулировать логичное условие отбора, вероятно это "пользователи зарегистрированные более месяца назад" тогда .Where(x => x.DateRegistration > DateTime.Today.AddMonth(-1)`
или "разница дат последнего захода и регистрации больше 1 года", но вот не всегда на сайтах так сильно морочатся - иногда просто смотрят на дату регистрации и текущую дату. Вот об этом был мой комментарий, что нет особого смысла так морочиться.
PS Возможно пригодится при расчёте дат на сервере: LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)'
TimeSpan? result = list.Where(w => w.Id == 1)
.Select(s => (TimeSpan?)(s.DateLastVisit - s.DateRegistration))
.FirstOrDefault();
Локальный пример:
public class User
{
public int Id { get; set; }
public DateTime DateRegistration { get; set; }
public DateTime DateLastVisit { get; set; }
}
List<User> list = new List<User>();
list.Add(new User() { Id = 1, DateLastVisit = DateTime.Now - TimeSpan.FromDays(1), DateRegistration = DateTime.Now - TimeSpan.FromDays(3) });
TimeSpan? result = list.Where(w => w.Id == 1).Select(s => (TimeSpan?)(s.DateLastVisit - s.DateRegistration)).FirstOrDefault();
Console.WriteLine(result);
Вывод: 2.00:00:00 //2 дня
Если пользователя нет (Id == 0): null