LINQ to SQL中的区别无法按预期运行(完全)

时间:2018-08-09 18:54:39

标签: vb.net linq linq-to-sql

我有一个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

我不确定这是怎么回事。谢谢您的帮助。

2 个答案:

答案 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()方法。