Я думаю, Find
имеет список «поддерживаемых выражений», которые можно использовать (через лямбда ) в качестве параметра - со значением фильтра.Поддерживаемые выражения перечислены (например) здесь в официальной документации драйвера .Net.
В коде C # вы можете использовать любое допустимое выражение C #, но при использовании выражения, не поддерживаемогодрайвер, вы получаете сообщение об ошибке.
ИМХО вы можете переписать ваш запрос, преобразовав DateTime.UtcNow
в метку времени Unix и используя преобразованное значение как eq
фильтр (типа long
) для x.ViewsToday.Date
.
Вы можете попробовать что-то вроде этого:
var now = DateTime.UtcNow.ToUnixTimeSeconds();
var results = await Settings.DataBase.GetCollection<Video>("Videos")
.Find(x => x.ViewsToday != null && x.ViewsToday.Date == now)
.ToListAsync();
EDITED
Как отмечается в комментарии, проблема заключается в применении только дата фильтр по метке времени Unix, также содержащий информацию о времени.Поскольку драйвер .Net MongoDb не может преобразовать даты в строку, используя предоставленный формат, мы можем попытаться применить противоположный подход, который я использовал в предыдущем примере, к началу текущего дня и началуследующего дня , преобразование условия ==
в новое условие на основе <
и >=
:
var now = DateTime.UtcNow;
var currentDate = now.Date;
var tomorrow = currentDate.AddDays(1);
var left = currentDate.ToUnixTimeSeconds();
var right = tomorrow.ToUnixTimeSeconds();
var results = await Settings.DataBase.GetCollection<Video>("Videos")
.Find(x => x.ViewsToday != null &&
x.ViewsToday.Date >= left &&
x.ViewsToday.Date < right)
.ToListAsync();