Linq到EF:从现在开始找到最近的Nullable Datetime

时间:2014-04-03 03:18:26

标签: c# linq entity-framework lambda nullable

我尝试并且仍然对可空日期时间的计算以及相应的linq语法感到困惑。我使用Linq到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();
}

我正在使用.net 4.0,谢谢!

2 个答案:

答案 0 :(得分:1)

我终于用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();
    }

答案 1 :(得分: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();

它将最接近的值打印到DateTime.Now