C# Linq to EF:从现在开始查找最近的可空日期时间
我尝试过,但仍然对可空datetime的计算和相应的linq语法感到困惑。我正在使用Linq to EF查找StartTime(可空)最接近现在的最近任务。为了简化,请参见演示:C# Linq to EF:从现在开始查找最近的可空日期时间,c#,linq,entity-framework,lambda,nullable,C#,Linq,Entity Framework,Lambda,Nullable,我尝试过,但仍然对可空datetime的计算和相应的linq语法感到困惑。我正在使用Linq to EF查找StartTime(可空)最接近现在的最近任务。为了简化,请参见演示: static void Main(string[] args) { DateTime? d0 = null; DateTime? d1 = new DateTime(2013, 1, 1); DateTime? d2 = new DateTime(2014, 1, 1); DateTim
static void Main(string[] args)
{
DateTime? d0 = null;
DateTime? d1 = new DateTime(2013, 1, 1);
DateTime? d2 = new DateTime(2014, 1, 1);
DateTime? d3 = new DateTime(2015, 1, 1);
DateTime? d4 = null;
List<DateTime?> dts = new List<DateTime?>() { d0, d1, d2, d3, d4 };
var v = dts.OrderBy(x => (DateTime.Now - (x)));//runs, but I need Math.Abs, and the nulls are before in order, I want nulls be behind
//var v = dts.OrderBy(x => (Math.Abs((DateTime.Now - (x)))));//best overloaded: Math.Abs(sbyte)
//var v = dts.OrderBy(x => (DateTime.Now - (x)).Milliseconds);//TimeSpan? does not contain 'Milliseconds'
foreach (var x in v)
Console.WriteLine(x);
Console.ReadLine();
}
static void Main(字符串[]args)
{
日期时间?d0=空;
DateTime?d1=新的日期时间(2013,1,1);
DateTime?d2=新的日期时间(2014,1,1);
DateTime?d3=新的日期时间(2015,1,1);
DateTime?d4=空;
List dts=新列表(){d0,d1,d2,d3,d4};
var v=dts.OrderBy(x=>(DateTime.Now-(x));//运行,但我需要Math.Abs,空值在前面,我希望空值在后面
//var v=dts.OrderBy(x=>(Math.Abs((DateTime.Now-(xщщ);//最佳重载:Math.Abs(sbyte)
//var v=dts.OrderBy(x=>(DateTime.Now-(x)).millizes);//TimeSpan?不包含“millizes”
foreach(v中的变量x)
控制台写入线(x);
Console.ReadLine();
}
我正在使用.NET4.0,谢谢 这很有效
var Nearest = dts.Where( d => d != null
&&
( (DateTime.Now - d) > new TimeSpan(0, 0, 0, 0, 0)
||
((TimeSpan)(DateTime.Now - d)).Negate() > new TimeSpan(0, 0, 0, 0, 0)
)
).OrderBy(d => d.Value).First();
它打印最接近日期时间的值。现在,我终于用x.value替换了x,编译错误消失了
static void Main(string[] args)
{
DateTime? d0 = null;
DateTime? d1 = new DateTime(2013, 1, 1);
DateTime? d2 = new DateTime(2014, 1, 1);
DateTime? d3 = new DateTime(2015, 1, 1);
DateTime? d4 = null;
List<DateTime?> dts = new List<DateTime?>() { d0, d1, d2, d3, d4 };
//I finally replaced x with x.Value, and compile error disappeared
var v = dts.Where(x => x.HasValue).OrderBy(x =>
(Math.Abs((DateTime.Now - x.Value).TotalMilliseconds)));
foreach (var x in v)
Console.WriteLine(x);
Console.ReadLine();
}
static void Main(字符串[]args)
{
日期时间?d0=空;
DateTime?d1=新的日期时间(2013,1,1);
DateTime?d2=新的日期时间(2014,1,1);
DateTime?d3=新的日期时间(2015,1,1);
DateTime?d4=空;
List dts=新列表(){d0,d1,d2,d3,d4};
//我最终用x.Value替换了x,编译错误消失了
var v=dts.Where(x=>x.HasValue).OrderBy(x=>
(Math.Abs((DateTime.Now-x.Value.total毫秒));
foreach(v中的变量x)
控制台写入线(x);
Console.ReadLine();
}
没有用,因为您没有看到我的第一条评论。我需要数学。Abs(最近的,不是第一个也不是最后一个。第二个也是错误的,它甚至过滤将来的日期!你能提供一个例子吗?如果所有日期都晚于2014年,例如2015年,也会有一个最接近的日期,但你的代码将一个也得不到。最后你需要订购(d=>d.Value)!你回到了起点!