Linq到实体与datetime列不同的年份

时间:2016-02-18 16:09:33

标签: c# sql-server linq

我有一张包含付款记录的表格。这些记录有一个日期时间列,其中包含购买的实际日期时间。现在我想在页面顶部放置一个动态填充的下拉列表,以便用户可以选择一年,然后查看该年度的付款记录。

为了做到这一点,我尝试将这些年份与支付记录区分开来。这就是我所拥有的,但它失败了

    List<DateTime> lstYears = new List<DateTime>();
    lstYears = context.Payments
               .Select(
                       p => new { p.TimeOfPurchase.GetValueOrDefault().Year }
                      )
               .Distinct()
               .ToList()
               .Select(x => new DateTime(x.Year, 1, 1))
               .ToList(); 

我收到的错误是&#39; LINQ to Entities无法识别方法GetValueOrDefault&#39;。但是当我删除该方法时,我无法输入&#34; p.TimeOfPurchase.Year &#34;。

是否可以只选择所有这些付款记录的不同年份?

1 个答案:

答案 0 :(得分:3)

试试p.TimeOfPurchase.Value.Year。由于它被翻译为SQL,因此应该处理空值。您可以添加Where子句来过滤空值。此外,您不需要将它放入匿名类。此外,您可以使用AsEnumerable将Linq转换为对象而不是ToList,这样可以避免创建不需要的列表。最后,只需将查询分配给您的变量,并且不要使用刚被丢弃的空列表对其进行初始化。

List<DateTime> lstYears = context.Payments
    .Where(p => p.TimeOfPurchase != null)
    .Select(p => p.TimeOfPurchase.Value.Year)
    .Distinct()
    .AsEnumerable()
    .Select(x => new DateTime(x, 1, 1))
    .ToList();