我目前正在努力实现以下目标:
我有一个IQueryable (UserDataDateRange)有"from"one_answers";to"DateTime-Values和另一个更大的IQueryable (UserData)与DateTime-value基本上我想从UserData中排除DateTime-value之间的每一个数据和";to"将它与每个UserDataDateRange-Entry进行比较。而且每个DateTime都是可空的我只想忽略它们
这是我尝试过的:
private IQueryable<Userdata> ExcludeIfInDaterange(IQueryable<Userdata> query)
{
var dateRangeQuery = DBContext.UserDateDateRange.Where(x => x.From.HasValue && x.To.HasValue);
query = query.Where(l => !l.UserDate.HasValue);
foreach (var q in dateRangeQuery)
{
query = query.Where(l => l.UserDate.Value <= q.From.Value && l.UserDate.Value >= q.To.Value);
}
return query;
}
从我的理解这应该工作?此外,我也尽量避免使用"toArray"因为从我的理解IQueryable基本上是我操作的SQL和toArray给我实际的数据。然而,我真的不知道我做错了什么,没有真正的例外,我只是得到以下错误:
无法从框架中获取函数。代码不可用。的错误码为CORDBG_E_CODE_NOT_AVAILABLE,或0x80131309.
我的函数似乎打破了查询,但我不知道为什么。我甚至不能使用&;Count()&;,它会给我同样的错误。
有人知道吗?
l.UserDate.Value <= q.From.Value && l.UserDate.Value >= q.To.Value
一个日期怎么可能同时早于From
日期和在同一时间晚于To
日期?除非你有一些非常奇怪的UserDateDateRange
表中的数据,过滤器将排除所有记录。
您还将两个互斥过滤器与AND
操作符组合在一起,这是排除所有记录的另一种方式:
!l.UserDate.HasValue
:UserDate
isNULL
l.UserDate.Value <= ...
:不可能满足,因为UserDate
是NULL
,没有必要使用.Value
nullable属性进行对比<
/<=
>
/>=
。
试试这样写:
private IQueryable<Userdata> ExcludeIfInDaterange(IQueryable<Userdata> query)
{
var dateRangeQuery = DBContext.UserDateDateRange.Where(x => x.From.HasValue && x.To.HasValue);
return query.Where(l => !l.UserDate.HasValue || !dateRangeQuery.Any(q => q.From <= l.UserDate && l.UserDate <= q.To));
}