我想在早上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"
答案 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
字段位于startHour
和endHour
之间的所有项目。
需要注意的是,可以使用扩展方法来大大简化此操作:
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提供商代替。在查询中使用扩展方法需要先将所有内容加载到内存中,我不建议这样做。