C# 如何在连接表时从DateTime获取没有时间的日期

C# 如何在连接表时从DateTime获取没有时间的日期,c#,linq,C#,Linq,我加入了三张桌子,我想在没有时间的情况下约会 var query = from anObjective in db.Objective join anObjectiveType in db.ObjectiveType on anObjective.IdType equals anObjectiveType.IdObjectiveType join statusCode in db.StatusCode on anOb

我加入了三张桌子,我想在没有时间的情况下约会

var query = from anObjective in db.Objective
    join anObjectiveType in db.ObjectiveType 
               on anObjective.IdType equals anObjectiveType.IdObjectiveType
    join statusCode in db.StatusCode 
               on anObjective.IdStatusCode equals statusCode.IdStatus
    select new
    {
          IdObjective = anObjective.IdObjective,
          ObjectiveName = anObjective.ObjectiveName,
          DateCreation = anObjective.DateCreation, //get just Date without time
          DateEnd = anObjective.DateEnd,  //get just Date without time

    };
我知道有一个方法
DbFunctions.TruncateTime
,但它返回的时间值为零值。但我只想得到一个没有时间的约会

var query = from anObjective in db.Objective
    join anObjectiveType in db.ObjectiveType 
               on anObjective.IdType equals anObjectiveType.IdObjectiveType
    join statusCode in db.StatusCode 
               on anObjective.IdStatusCode equals statusCode.IdStatus
    select new
    {
          IdObjective = anObjective.IdObjective,
          ObjectiveName = anObjective.ObjectiveName,
          DateCreation = anObjective.DateCreation, //get just Date without time
          DateEnd = anObjective.DateEnd,  //get just Date without time

    };
我也见过,但我不知道如何在加入时应用,而不是分组

模型类:

public partial class Objective
{
    public int IdObjective { get; set; }
    public string ObjectiveName { get; set; }
    public Nullable<System.DateTime> DateCreation { get; set; }
    public Nullable<System.DateTime> DateEnd { get; set; }    
}
那么我就有这样一个例外:

“System.Nullable”不包含的定义 “Date”和不接受第一个参数的扩展方法“Date” 找不到类型“System.Nullable”(是否为空) 缺少使用指令或程序集引用?)


如果我写:

那么我就有这样一个例外:

LINQ to实体无法识别方法“System.String” ToSortDateString()'方法,此方法无法转换为 商店用语

如果我写:

那么我就有这样一个例外:

LINQ to实体中不支持指定的类型成员“日期”。 仅初始值设定项、实体成员和实体导航属性 支持

添加“.Date”

添加“.Date”


我在想什么。日期时间只是一个整数。将两者减去午夜,它们将相等

DateTime epoch = new DateTime(1970,1,1,0,0,0);
int dateCreationInt = Math.Floor(dateCreation.Subract(epoch).TotalSeconds/86400);
int dateEndInt = Math.Floor(dateEnd.Subract(epoch).TotalSeconds/86400);
或者更好:

 DateTime epoch = new DateTime(1970,1,1,0,0,0);
int dateCreationInt = Math.Floor(dateCreation.Subract(epoch).TotalDays);
int dateEndInt = Math.Floor(dateEnd.Subract(epoch).TotalDays);
如果您需要DateTime,只需将整数重新转换为DateTime-它们仍然等于午夜,因此将被计算为“相等”:

现在,如果两个日期在同一日期,则无论时间如何,它们都将匹配

将所有内容放在一起

 DateTime epoch = new DateTime(1970,1,1,1);
 select new
{
      IdObjective = anObjective.IdObjective,
      ObjectiveName = anObjective.ObjectiveName,
      DateCreation = epoch.AddDays(anObjective.DateCreation.Subtract(epoch).TotalDays),
      DateEnd = epoch.AddDays(anObjective.DateEnd.Subtract(epoch).TotalDays)

};

我在想什么。日期时间只是一个整数。将两者减去午夜,它们将相等

DateTime epoch = new DateTime(1970,1,1,0,0,0);
int dateCreationInt = Math.Floor(dateCreation.Subract(epoch).TotalSeconds/86400);
int dateEndInt = Math.Floor(dateEnd.Subract(epoch).TotalSeconds/86400);
或者更好:

 DateTime epoch = new DateTime(1970,1,1,0,0,0);
int dateCreationInt = Math.Floor(dateCreation.Subract(epoch).TotalDays);
int dateEndInt = Math.Floor(dateEnd.Subract(epoch).TotalDays);
如果您需要DateTime,只需将整数重新转换为DateTime-它们仍然等于午夜,因此将被计算为“相等”:

现在,如果两个日期在同一日期,则无论时间如何,它们都将匹配

将所有内容放在一起

 DateTime epoch = new DateTime(1970,1,1,1);
 select new
{
      IdObjective = anObjective.IdObjective,
      ObjectiveName = anObjective.ObjectiveName,
      DateCreation = epoch.AddDays(anObjective.DateCreation.Subtract(epoch).TotalDays),
      DateEnd = epoch.AddDays(anObjective.DateEnd.Subtract(epoch).TotalDays)

};

看起来您首先需要.Value,因为它是一个可为空的日期时间。看看这个答案:


之后,您应该能够以与getshortdatestring不同的方式获取日期格式。

看起来您首先需要.Value,因为它是一个可为空的日期时间。看看这个答案:


之后,您应该能够以与getshortdatestring不同的方式获取日期格式。

首先,要认识到.NET中没有时间的日期没有内置类型。所以,如果您只想要日期,那么您将需要以某种特定格式的字符串形式

您无法让LINQ查询的底层提供程序理解
DateTime
string
的转换。因此,您需要以原始形式查询数据,然后在查询结果具体化后将其转换为字符串

从你的原始查询开始,未根据你在问题顶部显示的内容进行修改。然后添加以下内容:

var results = query.AsEnumerable().Select(x=>
new
{
    IdObjective = x.IdObjective,
    ObjectiveName = x.ObjectiveName,
    DateCreation = x.DateCreation.ToShortDateString(),
    DateEnd = x.DateEnd.ToShortDateString()
});
您还有一些选择:

  • 如果您知道您想要一个
    列表
    数组
    ,那么您可以使用
    ToList()
    ToArray()
    而不是
    AsEnumerable()

  • 如果希望生成的字符串采用特定格式,或使用特定区域性,则可以使用
    ToString
    而不是
    toSortDateString

例如,您可能希望数组包含标准ISO-8601日期字符串,并且可能希望使用不变区域性以避免当前区域性使用非公历系统时产生副作用

var results = query.ToArray().Select(x=>
new
{
    IdObjective = x.IdObjective,
    ObjectiveName = x.ObjectiveName,
    DateCreation = x.DateCreation.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture),
    DateEnd = x.DateEnd.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)
});

首先,认识到在.NET中没有没有时间的日期的内置类型。所以,如果您只想要日期,那么您将需要以某种特定格式的字符串形式

您无法让LINQ查询的底层提供程序理解
DateTime
string
的转换。因此,您需要以原始形式查询数据,然后在查询结果具体化后将其转换为字符串

从你的原始查询开始,未根据你在问题顶部显示的内容进行修改。然后添加以下内容:

var results = query.AsEnumerable().Select(x=>
new
{
    IdObjective = x.IdObjective,
    ObjectiveName = x.ObjectiveName,
    DateCreation = x.DateCreation.ToShortDateString(),
    DateEnd = x.DateEnd.ToShortDateString()
});
您还有一些选择:

  • 如果您知道您想要一个
    列表
    数组
    ,那么您可以使用
    ToList()
    ToArray()
    而不是
    AsEnumerable()

  • 如果希望生成的字符串采用特定格式,或使用特定区域性,则可以使用
    ToString
    而不是
    toSortDateString

例如,您可能希望数组包含标准ISO-8601日期字符串,并且可能希望使用不变区域性以避免当前区域性使用非公历系统时产生副作用

var results = query.ToArray().Select(x=>
new
{
    IdObjective = x.IdObjective,
    ObjectiveName = x.ObjectiveName,
    DateCreation = x.DateCreation.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture),
    DateEnd = x.DateEnd.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)
});

您是否尝试过使用
DateTime.Date
属性?顺便说一句,您似乎不是在
日期创建
日期结束
上加入的。您是否尝试过将“.Date”放在日期选择之后?e、 g.一个目标。日期创建。Date@StepUp:不,我的意思是使用您获得的
DateTime
值中的
Date
属性。我们不知道该属性可为Null,因此听起来您可能需要
DateCreation=anObjective.DateCreation?.Date
等。我不知道您真正想要的是什么-
DbFunctions。TruncateTime
是不受支持的
DateTime.Date
属性的EF查询等价物
DateTime.Date
还返回时间为零的
DateTime
。不能在DateTime字段中输入日期。C#和.NET中没有日期类型。是否尝试使用
DateTime.date
属性?顺便说一句,您似乎不是在
日期创建
日期结束
上加入的。您是否尝试过将“.Date”放在日期选择之后?e、 g.一个目标。日期创建。Date@StepUp:不,我的意思是使用
Da