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
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
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