Linq - 从日期时间中选择日期

Posted

技术标签:

【中文标题】Linq - 从日期时间中选择日期【英文标题】:Linq - Select Date from DateTime 【发布时间】:2013-10-02 00:43:18 【问题描述】:

我有一个Linq 结果,我只需要从DateTime 中选择Date。 我的查询是这样的:

var UserTemplates = (from xx in VDC.SURVEY_TEMPLATE
                     where xx.USER_ID == userid && xx.IS_ACTIVE == 1
                     select new
                     
                       xx.TEMPLATE_ID,
                       xx.TEMPLATE_NAME,
                       //CREATED_DATE = xx.CREATED_DATE.Value.Date
                       //CREATED_DATE = EntityFunctions.TruncateTime(xx.CREATED_DATE)
                       xx.CREATED_DATE
                     ).ToList();

这可能吗? 任何帮助将不胜感激。

CREATED_DATE - `datetime` datatype

实际上,我将它作为DataSource 绑定到控件,并且控件同时显示Date and Time。但我只想显示date

当我尝试使用 CREATED_DATE = xx.CREATED_DATE.Value.Date 时,它会给出如下错误:

LINQ to Entities 不支持指定的类型成员“日期”。 只有初始化器、实体成员和实体导航属性 支持。

【问题讨论】:

问题出在哪里? xx.CREATED_DATE.ToShortDateString() ? CREATED_DATE 是什么格式? 【参考方案1】:

如果是出于演示目的,那么您可以使用DataFormatString 属性。例如,如果您将数据源绑定到 GridView,您可以这样做;

<asp:BoundField DataField="CREATED_DATE" ...
     DataFormatString="0:d" ../>

否则,您可以使用EntityFunctions.TruncateTime(),它返回不带时间部分的输入日期。

EntityFunctions.TruncateTime(xx.CREATED_DATE)

您的查询会是这样的;

var UserTemplates = (from xx in VDC.SURVEY_TEMPLATE
                     where xx.USER_ID == userid && xx.IS_ACTIVE == 1
                     select new
                     
                       xx.TEMPLATE_ID,
                       xx.TEMPLATE_NAME,
                       EntityFunctions.TruncateTime(xx.CREATED_DATE) //new like
                     ).ToList();

【讨论】:

在较新版本的 Entity Framework 中,EntityFunctions 已替换为 DbFunctions 在 Entity Framework Core 中既不需要 EntityFunctions 也不需要 DbFunctions,日期字段可以很好地处理 .Date【参考方案2】:

使用这个...它对我有用..

var UserTemplates = (from xx in VDC.SURVEY_TEMPLATE
                     where xx.USER_ID == userid && xx.IS_ACTIVE == 1
                     select new
                     
                       xx.TEMPLATE_ID,
                       xx.TEMPLATE_NAME,
                       CREATED_DATE=SqlFunctions.DateName("day", xx.CREATED_DATE).Trim() + "/" +
        SqlFunctions.StringConvert((double)xx.CREATED_DATE.Value.Month).TrimStart() + "/" +
        SqlFunctions.DateName("year", xx.CREATED_DATE)
         ).ToList();

输出日期为 dd/MM/yyyy 格式

【讨论】:

【参考方案3】:

也许是这个?

var qry = (from xx in VDC.SURVEY_TEMPLATE
           where xx.USER_ID == userid && xx.IS_ACTIVE == 1
           select new  xx.TEMPLATE_ID, xx.TEMPLATE_NAME, xx.xx.CREATED_DATE );

var UserTemplates = qry.AsEnumerable().Select(xx => new 
                    
                       xx.TEMPLATE_ID,
                       xx.TEMPLATE_NAME,
                       xx.CREATED_DATE.Value.Date 
                    ).ToList();

【讨论】:

它没有像'.Date'这样的属性。它只有“.Value.Date”之类的属性,但它不起作用并给出如下错误:LINQ to Entities 不支持指定的类型成员“日期”。仅支持初始化器、实体成员和实体导航属性。 @RealSteel 如果您完全遵循它,这应该可以工作。原因是.Date 调用是在 Linq to Object 而不是 Linq to Entities 中运行的。仍然。这不是我的首选解决方案。 @Aron 这也不是我的首选解决方案。如果该值是出于显示目的而获得的,我什至根本不在乎将其设为查询中的日期。控件应该有一个用于显示值的 FormatString。 收到此错误:“LINQ to Entities 不支持指定的类型成员 'Date'。仅支持初始化程序、实体成员和实体导航属性。”【参考方案4】:
var UserTemplates = (from xx in VDC.SURVEY_TEMPLATE
                     where xx.USER_ID == userid && xx.IS_ACTIVE == 1 select  xx).AsEnumerable()
                     .Select( i=> new
                     
                       i.TEMPLATE_ID,
                       i.TEMPLATE_NAME,
                       CREATED_DATE = i.CREATED_DATE.ToString("M/d/yyyy"),
                       i.CREATED_DATE
                     ).ToList();

【讨论】:

查询正文必须以 select 子句或 group 子句结尾 @RealSteel 答案已更新【参考方案5】:

试试这个,

var UserTemplates = (from xx in VDC.SURVEY_TEMPLATE
                 where xx.USER_ID == userid && xx.IS_ACTIVE == 1
                 select new Attributes
                 
                   TEMPLATE_ID=xx.TEMPLATE_ID,
                   TEMPLATE_NAME=xx.TEMPLATE_NAME,
                   dateCreatd = xx.CREATED_DATE                      
                 )
                 .AsEnumerable()
                 .select(p=>new Attributes
                 
                   TEMPLATE_ID =p.TEMPLATE_ID,
                   TEMPLATE_NAME=p.TEMPLATE_NAME,
                   dateString = p.dateCreatd .Value.toString("YYYY-MMM-dd")                       
                 ).ToList();


public class Attributes

 public string TEMPLATE_ID  get; set; 
 public string TEMPLATE_NAME  get; set 
 public DateTime dateCreatd  get; set; 
 public string dateString  get; set; 


希望对你有用

【讨论】:

以上是关于Linq - 从日期时间中选择日期的主要内容,如果未能解决你的问题,请参考以下文章

当用户从日期选择器中选择日期时,如何在下拉列表中获取特定的星期几?

Ember JS从日期选择器中选择日期时,更改按钮组件的颜色和标题

SQL Server 2008 仅从字段中选择日期 [重复]

在日期选择器中选择日期后如何打开时间选择器

在日期选择器中选择日期之前触发功能

从 UITextField 单击事件 MonoTouch 在 UIDatePicker 中选择日期