如何获取实体框架中特定时间之间的记录

时间:2017-07-28 10:50:30

标签: c# linq model-view-controller

我想在早上7点到下午3点之间获取记录。如何编写linq查询相同的?

 var items = Pirs.Where(a => !a.dataFrame.EndsWith("AAAAAAAAAAA=") && (fromDate == null || fromDate.Value.Date <= TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime(a.timestamp), TimeZoneInfo.FindSystemTimeZoneById("India Standard Time")).Date) && (toDate == null || toDate.Value.Date >= TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime(a.timestamp), TimeZoneInfo.FindSystemTimeZoneById("India Standard Time")).Date) && (a.timestamp.Hour > 7 || a.timestamp.Hour < 15))
               .GroupBy(a => a.dataFrame.Substring(a.dataFrame.Length - 12))
               .Select(g => g.First()).OrderBy(a => a.timestamp);

示例数据

timestamp   "2017-07-21T14:06:02.203Z"

1 个答案:

答案 0 :(得分:1)

你的问题的编写方式,很难准确理解你的问题,所以我会给你一个实现你想要的一般方法。

假设您有一个班级Foo

class Foo
{
    public DateTime date { get; set; }
}

如果有List<Foo>,您可以在该列表中获取Foo所有date属性的实例,这些实例在特定时间之间如下:

var myList = new List<Foo>();
int startHour = 7; // 7am
int endHour = 15; // 3pm
var result = myList.Where(item => item.date.Hour >= startHour && item.date.Hour <= endHour);

result枚举包含myList date属性的Hour字段位于startHourendHour之间的所有项目。

需要注意的是,可以使用扩展方法来大大简化此操作:

public static bool Between(DateTime input, int x, int y)
{
    return (input.Hour => x && input.Hour <= y);
}

var result = myList.Where(item => item.date.Between(7, 15));

但是,您提到您使用的是Entity Framework,这是第二个解决方案与之不兼容的,因为当您查询DbSet时,该操作不是由您的程序执行的,而是由EF转换为SQL并执行而是由DB提供商代替。在查询中使用扩展方法需要先将所有内容加载到内存中,我不建议这样做。