Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从datetime列到不同年份的Linq_C#_Sql Server_Linq - Fatal编程技术网

C# 从datetime列到不同年份的Linq

C# 从datetime列到不同年份的Linq,c#,sql-server,linq,C#,Sql Server,Linq,我有一张包含付款记录的表格。这些记录有一个datetime列,其中包含购买的实际日期时间。现在我想在页面顶部放置一个动态填充的下拉列表,以便用户可以选择一年,然后查看该年的付款记录 为了做到这一点,我试图区分付款记录中的年份。这就是我所拥有的,但它失败了 List<DateTime> lstYears = new List<DateTime>(); lstYears = context.Payments .Select(

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

为了做到这一点,我试图区分付款记录中的年份。这就是我所拥有的,但它失败了

    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(); 
List lstreats=新列表();
lstYears=上下文。付款
.选择(
p=>new{p.TimeOfPurchase.GetValueOrDefault().Year}
)
.Distinct()
托利斯先生()
.选择(x=>newdatetime(x.Year,1,1))
.ToList();
我收到的错误是“LINQ to Entities无法识别方法GetValuerDefault”。但当我删除该方法时,我无法键入“p.TimeOfPurchase.Year


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

尝试
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(); 
List lstYears=context.Payments
.Where(p=>p.TimeOfPurchase!=null)
.Select(p=>p.TimeOfPurchase.Value.Year)
.Distinct()
.可计算的()
.选择(x=>newdatetime(x,1,1))
.ToList();

试试
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(); 
List lstYears=context.Payments
.Where(p=>p.TimeOfPurchase!=null)
.Select(p=>p.TimeOfPurchase.Value.Year)
.Distinct()
.可计算的()
.选择(x=>newdatetime(x,1,1))
.ToList();

试试
p.TimeOfPurchase.Value.Year
。因为它被转换为SQL,所以空值应该被处理。@juharr这个简单的更改很好地解决了这个问题,非常感谢p.TimeOfPurchase.Value.Year。因为它被转换为SQL,所以空值应该被处理。@juharr这个简单的更改完美地完成了这个任务,非常感谢