在特定时间之间搜索

时间:2018-01-16 16:58:07

标签: sql asp.net linq datetime

我有一个日期字段和两个时间字段(开始时间和结束时间)。我必须从日期获取数据并输入该日期字段以及开始和结束时间之间。 我正在使用Linq查询。

result = result.Where(x => x.CreatedDate.ToLocalTime() > search.StartTime && 
x.CreatedDate.ToLocalTime() < search.EndTime);

我正在使用此但我收到以下错误。 LINQ to Entities无法识别方法&#39; System.DateTime ToLocalTime()&#39;方法,此方法无法转换为商店表达式

请帮助。

2 个答案:

答案 0 :(得分:0)

Panagiotis Kanavos指出,可能没有相应的论点。虽然您确实拥有正确的类型,但实质上是将一个DateTime转换为另一个。谓词值和集合的值应该优选地存储在相同的TimeZone中。这是一个简单的控制台示例,以显示我的意思。

    public class TestData
    {
        public DateTime Dt { get; set; }
        public TestData(DateTime dt)
        {
            Dt = dt;
        }

        public override string ToString() => Dt.ToString();
    }

    static void Main(string[] args)
    {
        var dt = new DateTime(2018, 1, 11);
        var s = dt;
        var e = dt.AddHours(3);
        var dts = new List<TestData>();
        for (int i = 0; i < 10; i++)
        {
            dts.Add(new TestData(dt.AddHours(i)));
        }

        Console.WriteLine("Dates as are");
        dts.ForEach(Console.WriteLine);
        Console.WriteLine(Environment.NewLine);

        Console.WriteLine("Dates to local time are");
        dts.ForEach(x => Console.WriteLine(x.Dt.ToLocalTime()));
        Console.WriteLine(Environment.NewLine);

        Console.WriteLine("searches are");
        Console.WriteLine(s);
        Console.WriteLine(e);
        Console.WriteLine(Environment.NewLine);

        Console.WriteLine("searches to local time are");
        Console.WriteLine(s.ToLocalTime());
        Console.WriteLine(e.ToLocalTime());
        Console.WriteLine(Environment.NewLine);

        Console.WriteLine("Weird results as one set is cast to local and other is not.  Plus the cast is now performed on presentation");
        dts.Where(x => x.Dt.ToLocalTime() >= s && x.Dt.ToLocalTime() <= e).ToList().ForEach(Console.WriteLine);
        Console.WriteLine(Environment.NewLine);

        Console.WriteLine("expected results as both are uniform");
        dts.Where(x => x.Dt >= s && x.Dt <= e).ToList().ForEach(Console.WriteLine);

        Console.ReadLine();
    }

由于SO上的不同海报位于不同的时区,因此第二个结果集会有所不同。但基本上我在美国的太平洋标准时间,所以我看到第一集在我第一次出现前八小时的时间。如果您的应用程序将在全球范围内甚至是全国范围内,您通常在.NET中执行存储操作为UTC。然后,您只需处理DateTimes,并且只在客户端进行转换,以便向潜在的最终用户进行演示。但大部分时间都不在谓词的逻辑中。

答案 1 :(得分:0)

您不能将ToLocalTime()用于Linq to Entities。因为它无法转换为SQL。没有相应的应用它。

那么,为什么不通过考虑存储在数据库中的所需时区来转换startTimeendTime。相反的转换应该是这样的;

//I use utc time to provide example. 
//Convert your dates with required timezones which is stored in the database
var startTime = search.StartTime.ToUtcDateTime();
var endTime = search.EndTime.ToUtcDateTime();
result = result.Where(x => x.CreatedDate > startTime &&
                            x.CreatedDate < endTime);