我有一个日期字段和两个时间字段(开始时间和结束时间)。我必须从日期获取数据并输入该日期字段以及开始和结束时间之间。 我正在使用Linq查询。
result = result.Where(x => x.CreatedDate.ToLocalTime() > search.StartTime &&
x.CreatedDate.ToLocalTime() < search.EndTime);
我正在使用此但我收到以下错误。 LINQ to Entities无法识别方法&#39; System.DateTime ToLocalTime()&#39;方法,此方法无法转换为商店表达式
请帮助。
答案 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。没有相应的应用它。
那么,为什么不通过考虑存储在数据库中的所需时区来转换startTime
和endTime
。相反的转换应该是这样的;
//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);