从datetime列中选择年份,返回具有不同年份Linq To SQL vb.net的新列表

时间:2011-11-05 00:27:22

标签: linq-to-sql datetime

我有一个关于日期时间的专栏,希望在新列表中获得目标年份。

目标是使用从Games.Date列中提取的不同年份(YYYY,而不是YYYY-MM-DD HH:MM:SS)填充DropDownList。

我拥有的物品:

LDSYears (LinqDataSource)
LDSUserResults (LinqDataSource)
DropDownList1
LDSYears_Selecting (LinqDataSourceSelectEvent)
GridView1

我想我会使用LDSYears来填充DropDownList1,然后使用DropDownList1作为LDSUserResults中的Where语句来仅过滤DropDownList1中所选年份的用户结果。

LinqDataSourceSelectEvent是代码所在的位置。我在事件中有这个代码的原因是,我读过它不可能在LinqDataSource中使用destinct,我也想将输出修剪为仅年,而不是日期时间。

Protected Sub LDSYears_Selecting(sender As Object, _
        e As System.Web.UI.WebControls.LinqDataSourceSelectEventArgs) _
    Handles LDSYears.Selecting

    Dim years = From dy In (From ys In db.Games _
                            Where ys.Date.Year.ToString <> "" Distinct _
                            Select ys.ID, ys.Date Distinct) _
                        Select dy _
                        Order By dy.Date Descending
    e.Result = years
End Sub

Games.Date专栏:

2009-01-10 09:00:00
2009-03-10 09:00:00
2010-02-10 09:00:00
2010-03-10 09:00:00
2011-01-10 09:00:00
2011-03-10 09:00:00

我想要一个像这样的新列表填充到我的DropDownList,索引的ID和值的年份:

ID Years
1  2011
2  2010
3  2009

也许我以错误的角度看待这个问题,它应该成为可能?

我可以通过代码执行此操作,但我认为这是使用DropDownList作为LDSUserResults的过滤器的更好方法。

2 个答案:

答案 0 :(得分:0)

听起来像你真正需要做的就是选择不同年份而你不需要ID。为什么不使用年份而不是两者的ID,这会有效吗?如果是,则为(From ys In db.Games Select ys.Date.Year).Distinct

ID的问题在于,如果两个游戏的年份相同,那么您返回哪个ID?

答案 1 :(得分:0)

假设您可以使用Integer列表以及索引,只需执行以下操作:

Dim years = (From dy In dc.Dates 
                Select dy.Date1.Year).Distinct().OrderByDescending(Function(year) year).AsEnumerable().Select(Function(year, index) New With {index, year})

Response.Write(String.Join(", ", years))

正如Craig所指出的那样,如果您所做的只是绑定到DDL,则不需要ID。 DDL的每个列表项本身都有一个可以使用的索引。