[英]Date range filter in linq to crm
我正在使用LINQ查询CRM实体。 下面是我的代码
var data = svcContext.CreateQuery("myentity");
if (info.FromDate != null && info.ToDate != null)
{
data = data.Where(r => r.GetAttributeValue<DateTime>("rundate") >= info.FromDate.Value.Date && r.GetAttributeValue<DateTime>("rundate") <= info.ToDate.Value.Date);
}
这将返回FromDate和ToDate之间的所有记录,但在比较返回错误记录的时间时也要考虑时间部分。 我想截断时间部分,仅使用日期部分进行比较。 我已经使用过这样的代码
1。
if (info.FromDate != null && info.ToDate != null)
{
data = data.Where(r => r.GetAttributeValue<DateTime>("rundate").Date >= info.FromDate.Value.Date && r.GetAttributeValue<DateTime>("rundate").Date <= info.ToDate.Value.Date);
}
2。
if (info.FromDate != null && info.ToDate != null)
{
data = data.Where(r => Convert.ToDateTime(r.Attributes["rundate"]).Date >= info.FromDate.Value.Date && Convert.ToDateTime(r.Attributes["rundate"]).Date <= info.ToDate.Value.Date);
}
3。
if (info.FromDate != null && info.ToDate != null)
{
data = data.Where(r => EntityFunctions.TruncateTime(r.GetAttributeValue<DateTime>("rundate")) >= info.FromDate.Value.Date && EntityFunctions.TruncateTime(r.GetAttributeValue<DateTime>("rundate")).Date <= info.ToDate.Value.Date);
}
所有这些都返回“无效的'where'条件。实体成员正在调用无效的属性或方法。” 错误。 因此,如何仅按日期部分和截断时间部分进行比较。 谢谢..
如果实际时间无关紧要,为什么不通过以下方式查询记录
var data = svcContext.CreateQuery("myentity");
if (info.FromDate != null && info.ToDate != null)
{
var compareFromDate = info.FromDate.Value.Date;
var compareToDate = info.ToDate.Value.Date.AddDays(1);
data = data.Where(r => r.GetAttributeValue<DateTime>("rundate") >= compareFromDate && r.GetAttributeValue<DateTime>("rundate") < compareToDate);
}
CRM LINQ提供程序具有LINQ to Objects所没有的一些限制。
将ToList()添加到CreateQuery结果转换为使用LINQ to Objects,这应允许您执行所需的操作。
对于您要进行的比较,将其覆盖为OLE Automation的十进制日期格式(OADate),然后强制转换为int,以提供不带任何时间成分的日期序列号。
而且,为清楚起见,我将谓词移至单独的方法。
public override void Run()
{
using (var context = new Microsoft.Xrm.Sdk.Client.OrganizationServiceContext(svc))
{
var result = (from e in context.CreateQuery("account").ToList()
.Where(ne => isBetween(ne.GetAttributeValue<DateTime>("createdon"), DateTime.MinValue, DateTime.Now))
select e).ToList();
}
}
private bool isBetween(DateTime value, DateTime min, DateTime max)
{
var val = (int)value.ToOADate();
return val >= (int)min.ToOADate() || val <= (int)max.ToOADate();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.