Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.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
Vb.net LINQ to SQL中的Distinct未按预期工作(完全)_Vb.net_Linq_Linq To Sql - Fatal编程技术网

Vb.net LINQ to SQL中的Distinct未按预期工作(完全)

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

我有一个包含组合框和列表框的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
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抛出的异常。再次感谢。