2017-07-28 44 views
0

我想在上午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

你的问题被写入的方式,也很难理解你问什么,所以我会给你实现的一般方法你想要什么(我想)。

假设你有一个类,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)); 

不过,你提到你正在使用实体框架,其中第二个解决方案是不兼容的,当你查询自一个DbSet,该操作不是由您的程序执行,而是由EF转换为SQL并由DB提供程序执行。在查询中使用扩展方法需要首先将所有内容加载到内存中,我不建议这样做。

相关问题