как с помощью 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 шт):

Автор решения: Игорь
(Date2 - Date1).TotalSeconds 

можно любую интервальность выбрать

→ Ссылка
Автор решения: A K

Если я правильно понял задачу:

.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)'

→ Ссылка
Автор решения: Blackmeser
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

→ Ссылка