如何从Linq中的datetime列获取Month Name到SQL?

时间:2012-03-04 14:04:48

标签: c# linq linq-to-sql datetime

我的表格中有DateTime列。

在Linq to SQL查询中,我只需要该字段的Month部分

如何编写Linq查询?

3 个答案:

答案 0 :(得分:6)

嗯,我可以立即想到三个选项:

  • 将整个DateTime拉回来,然后提取月份并将其格式化为客户端
  • 使用DateTime.Month从数据库中提取月份,然后将其格式化为客户端
  • 尝试将格式化(转换为文本)用于数据库

就个人而言,我尝试第三种选择 - 我觉得它不太可能有效,至少没有多少努力。

我怀疑我实际只是拉回DateTime,然后一切客户端。这样做非常容易,而且必然会起作用。我希望DateTime.Month 可能可以正常工作,但您不会将非常的网络带宽保存起来,并且您将让服务器继续工作这对客户来说可能很容易。

请注意,如果您仍希望将结果作为查询,则可以使用AsEnumerable强制查询的其余部分在客户端完成。例如:

var query = db.Customers
              .Where(c => c.OrderCount > 500) // Or whatever query you want
              .Select(c => new { c.Name, c.FirstOrder })
              .AsEnumerable() // Do the rest of the query on the client
              .Select(c => new { c.Name, c.Month = c.FirstOrder.ToString("MMM") });

编辑:如评论中所述,如果它实际上会影响结果,则在服务器端使用DateTime.Month是有意义的,例如

var query = db.Customers.Where(c => c.FirstOrder.Month == 1)
                        ...

...但在这些情况下,我希望它是重要的数值,而不是当月的名称

答案 1 :(得分:1)

类似的东西:

string monthName = dataContext.GetTable<TableName>()
                              .FirstOrDefault(t => t.DateTimeColumn)
                              .ToString("MMM");               

答案 2 :(得分:0)

您需要使用Enumerable将表转换为ToList()类型,因为您不能在查询类型上使用ToString()

var result = from sales in SalesOrderHeaders.ToList()
    select new {
        Sales_Order_ID = sales.SalesOrderID,
        Territory_ID = sales.TerritoryID,
        Month = sales.OrderDate.ToString("MMMM"),
        Year = sales.OrderDate.Year
};
result.Dump();