我正在使用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);
}
这些全部返回“无效”其中'条件。实体成员正在调用无效的属性或方法。“错误。那么如何仅通过日期部分和截断时间部分进行比较。谢谢..
答案 0 :(得分:1)
如果实际时间无关紧要,为什么不通过
查询您的记录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);
}
答案 1 :(得分:0)
CRM LINQ提供程序有一些LINQ to Objects没有的限制。
将ToList()添加到CreateQuery结果转换为使用LINQ to Objects,这应该允许您执行所需的操作。
对于您要进行的比较,转换为OLE自动化的十进制日期格式(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();
}