我有一个ASPX网页,其中包含一个组合框和一个列表框。当用户进行选择时,该列表框应填充不同的年份。
为此提供数据的数据源是一个.dbml,它具有一个表并包含Date列。具有这样的数据:
2018-01-16 00:00:00.000
2017-01-06 00:00:00.000
2017-01-06 00:00:00.000
2018-01-11 00:00:00.000
2018-01-11 00:00:00.000
2018-01-11 00:00:00.000
2017-10-03 00:00:00.000
2017-10-03 00:00:00.000
2018-01-03 00:00:00.000
所以在列表框中,我只希望:
2017
2018
但是,每年都有。
2018
2017
2017
2018
2018
2018
2017
2017
2018
我的LINQ看起来像:
Using context As New ACE_Data Context()
Dim aircraft As String = comboSelectAircraft.Value
Dim year As Table(Of A_DETAIL_REPO) = context.A_DETAIL_REPOs
Dim query = From ace In context.GetTable(Of A_DETAIL_REPO)()
Where ace.Series.Equals(aircraft)
Select DateAndTime.Year(ace.Date)
Distinct
listYear.DataSource = query
listYear.DataBind()
End Using
我不确定这是怎么回事。谢谢您的帮助。
答案 0 :(得分:5)
DateAndTime.Year(ace.Date)
部分无法转换为SQL。在这种情况下,LINQ-to-SQL会自动切换为客户端评估。也就是说,它会在SQL中尽可能多地执行,然后在.Net代码中继续执行无法翻译的部分。
但是这里这种方法失败了,因为作为SQL执行的部分是:
From ace In context.GetTable(Of A_DETAIL_REPO)()
Where ace.Series.Equals(aircraft)
Select ace.Date
Distinct
在查询DateAndTime.Year(ace.Date)
应用于客户端的 的结果列表上。因此,简而言之,您将获得不同日期的年份部分,而不是日期的不同年份部分。
解决方案是使用ace.Date.Year
。可以将其转换为SQL DATEPART
函数,因此DISTINCT
将应用于年份。
答案 1 :(得分:1)
这应该有效
Dim query = (From ace In context.GetTable(Of A_DETAIL_REPO)()
Where ace.Series.Equals(aircraft)
Select DateAndTime.Year(ace.Date)).Distinct()
这将强制您的选择语句返回IEnumerable,然后可以在IEnumerable接口上使用.Distinct()方法。