【发布时间】:2018-12-17 14:30:26
【问题描述】:
public class Quest : RealmObject
{
[PrimaryKey]
public string Id { get; set; } = Guid.NewGuid().ToString();
public DateTimeOffset StartDate { get; set; }
public DateTimeOffset EndDate { get; set; }
public string Name { get; set; }
public int MaxRepeats { get; set; }
[Backlink(nameof(HistoryItem.Quest))]
public IQueryable<HistoryItem> HistoryItems{ get; }
}
public class HistoryItem : RealmObject
{
[PrimaryKey]
public string Id { get; set; } = Guid.NewGuid().ToString();
public DateTimeOffset DoneTime { get; set; }
public Quest Quest { get; set; }
}
我需要得到什么:
在 1 天的日期范围内过滤保留所有 MaxRepeats == 0 的任务 + 过滤其余已完成的任务- 保留 MaxRepeatsPerMonth == 0 的所有任务 + 过滤已完成的其余任务 --问题
我当前的代码是:
private IQueryable<Quest> SearchQuery(DateTime day)
{
var dayStart = day.AddMilliseconds(-100);
var dayEnd = day.AddHours(24).AddMilliseconds(100);
var monthStart = day.Date.AddDays(-day.Day +1).AddMilliseconds(-100);
int daysInMonth = DateTime.DaysInMonth(day.Year, day.Month);
var monthEnd = monthStart.AddDays(daysInMonth).AddMilliseconds(200);
return _db.Realm.All<Quest>().Where(a => a.StartDate < dayStart &&
a.EndDate > dayEnd) // done 1
.Filter("MaxRepeats == 0 OR HistoryItems.@count <= MaxRepeats") // done 2
.Filter("MaxRepeatsPerMonth == 0 OR (HistoryItems.DoneTime BETWEEN {%@, %@}).@count <= MaxRepeatsPerMonth"); //an Issue
}
我已经找到了 Swift 的解决方案(过滤器语法对所有语言都是一样的)......但是不可能写
_db.Realm.All<HistoryItem>().Filter("DoneTime BETWEEN {%@, %@}", date1, date2);
因为过滤器在.NET中只有一个输入参数
我不能写:
_db.Realm.All<HistoryItem>().Filter("DoneTime BETWEEN {"+ date1+","+ date2 + "}");
在这种情况下,日期将以另一种 DateTime 格式写入,而不是 Filter() 方法所需的格式。
我也不能使用 Where() 方法,因为它有一个限制,我不能在其中使用 Count()。 (我只能在 reaml 事务中使用 Count(),但在我的情况下这样做是错误的)。
那么...如何在 .NET 中使用领域的过滤器?
【问题讨论】: