【问题标题】:Linq - Select Date from DateTimeLinq - 从日期时间中选择日期
【发布时间】: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 是什么格式?

标签: c# .net sql linq datetime


【解决方案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; }
    
    }
    

    希望对你有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-17
      • 2021-09-09
      • 1970-01-01
      • 2015-05-14
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多