繁体   English   中英

linq至crm中的日期范围过滤器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM