如果输入日期不为null,则按日期范围搜索实体框架

时间:2015-04-09 08:58:50

标签: c# entity-framework

我想根据日期范围搜索数据,并且我想检查输入和输入是否输入而不是检查日期范围,否则获取所有记录。 以下是我的疑问..请帮帮我。

    from a in context.ABC
    join b in context.XYZ on a.ABCID equals b.Id
    where (txtFromDate.Text =="" ?  b.UploadDate.ToString().Contains(txtFromDate.Text) : 
    System.Data.Entity.DbFunctions.TruncateTime(b.UploadDate) >= System.Data.Entity.DbFunctions.TruncateTime(DateTime.Parse( txtFromDate.Text, new CultureInfo("en-GB"))) &&
                                         txtToDate.Text==""?b.UploadDate.ToString().Contains(txtToDate.Text): System.Data.Entity.DbFunctions.TruncateTime(b.UploadDate) >= System.Data.Entity.DbFunctions.TruncateTime(DateTime.Parse(txtToDate.Text, new CultureInfo("en-GB"))))
group new { a, b } by System.Data.Entity.DbFunctions.TruncateTime(b.UploadDate) into c
select new
{
UploadDate = System.Data.Entity.DbFunctions.TruncateTime(c.FirstOrDefault().b.UploadDate),
XYZ = c.Count(),
Lines = c.Sum(x => x.a.number)
}

1 个答案:

答案 0 :(得分:0)

步骤1:在进入LINQ查询之前为参数创建新变量。在查询期间清理参数是不好的做法。如你所见,它使它非常混乱。我建议使用" Date"类型,如果值为null,实际上将它作为过去/未来的日期。这可以节省额外的工作量......例如。

var dteParam1 = string.IsNullOrEmpty(txtFromDate.Text) ? new Date(1901, 1, 1) : Date.Parse(txtFromDate.Text);

步骤2:制作日期扩展方法,检查日期是否在两个日期之间。然后你可以在你的where子句中使用它,例如

b.UploadDate.IsBetween(dteParam1, dteParam2)

你必须在互联网的其他地方找到一个例子......

步骤3:在您的LINQ查询中,您可以使用这样的where子句:

where (b.UploadDate == null || b.UploadDate.IsBetween(dteParam1, dteParam2))

其工作方式如下:如果From date为null且To date为null,则始终返回所有内容。如果From为null且To不为null,或反之亦然,则它将过滤到该范围内。如果数据库值为null,则无论您将哪个项目作为过滤器,它都会返回该项目。

相关问题