Vb.net LINQ to SQL中的Distinct未按预期工作(完全)
我有一个包含组合框和列表框的ASPX网页。当用户做出选择时,列表框应该填充不同的年份 为此提供支持的数据源是一个.dbml,它有一个表并包含一个日期列。有如下数据:Vb.net LINQ to SQL中的Distinct未按预期工作(完全),vb.net,linq,linq-to-sql,Vb.net,Linq,Linq To Sql,我有一个包含组合框和列表框的ASPX网页。当用户做出选择时,列表框应该填充不同的年份 为此提供支持的数据源是一个.dbml,它有一个表并包含一个日期列。有如下数据: 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
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
我不确定这是怎么回事。非常感谢您的帮助。这应该行得通
Dim query = (From ace In context.GetTable(Of A_DETAIL_REPO)()
Where ace.Series.Equals(aircraft)
Select DateAndTime.Year(ace.Date)).Distinct()
这将强制您的select语句返回IEnumerable,然后您可以在IEnumerable接口上使用.Distinct方法。这应该有效
Dim query = (From ace In context.GetTable(Of A_DETAIL_REPO)()
Where ace.Series.Equals(aircraft)
Select DateAndTime.Year(ace.Date)).Distinct()
这将强制您的select语句返回IEnumerable,然后您可以在IEnumerable接口上使用.Distinct方法。无法将part DateAndTime.Yearace.Date转换为SQL。在这种情况下,LINQ到SQL自动切换到客户端评估。也就是说,它在SQL中尽可能多地执行,然后在.Net代码中继续执行无法翻译的部分
但这种方法在这里失败了,因为作为SQL执行的部分是:
From ace In context.GetTable(Of A_DETAIL_REPO)()
Where ace.Series.Equals(aircraft)
Select ace.Date
Distinct
在该查询的结果列表上,DateAndTime.Yearace.Date应用于客户端。简而言之,你得到的是不同日期的年份部分,而不是日期的不同年份部分
解决方案是使用ace.Date.Year。这可以转换为SQL DATEPART函数,因此DISTINCT将应用于年份。无法将部分DateAndTime.Yearace.Date转换为SQL。在这种情况下,LINQ到SQL自动切换到客户端评估。也就是说,它在SQL中尽可能多地执行,然后在.Net代码中继续执行无法翻译的部分
但这种方法在这里失败了,因为作为SQL执行的部分是:
From ace In context.GetTable(Of A_DETAIL_REPO)()
Where ace.Series.Equals(aircraft)
Select ace.Date
Distinct
在该查询的结果列表上,DateAndTime.Yearace.Date应用于客户端。简而言之,你得到的是不同日期的年份部分,而不是日期的不同年份部分
解决方案是使用ace.Date.Year。这可以转换为SQL DATEPART函数,因此DISTINCT将应用于年份。感谢您的解释,这真的很有帮助。我不知道LINQ到SQL可以切换评估方法。作为补充说明,我最终不得不使用ace.Date.Value.Year作为ace.Date.Year抛出的异常。再次感谢。谢谢你的解释,这真的很有帮助。我不知道LINQ到SQL可以切换评估方法。作为补充说明,我最终不得不使用ace.Date.Value.Year作为ace.Date.Year抛出的异常。再次感谢。