C# Linq to EF:从现在开始查找最近的可空日期时间

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

我尝试过,但仍然对可空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);
    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)!你回到了起点!