有没有办法比较Linq2Sql中的2个DateTime变量,但忽略了Time部分.
该应用程序将项目存储在数据库中并添加已发布的日期.我想保留确切的时间,但仍然可以按日期本身.
我想比较12/3/89 12:43:34和12/3/89 11:22:12然后忽略实际的时间,所以这两个都被认为是相同的.
我想我可以在比较之前将所有时间设置为00:00:00但我实际上确实想知道一天中的时间我也希望能够仅按日期进行比较.
我找到了一些具有相同问题的代码,他们分别比较了年,月和日.有一个更好的方法吗?
我想在使用EF6时封装常见的场景.这是一个例子:
public class StringRequest : DbRequestProperty
{
public string Name { get; set; }
public bool? ExactMatch { get; set; }
protected override bool IsValid()
{
return !string.IsNullOrWhiteSpace(Name);
}
private bool RequestExactMatch()
{
return ExactMatch.HasValue && ExactMatch.Value;
}
protected override IQueryable<T> Execute<T>(IQueryable<T> original, string propertyName)
{
return RequestExactMatch()
? original.Where(o => GetProperty<string>(o, propertyName) == Name)
: original.Where(o => GetProperty<string>(o, propertyName).Contains(Name));
}
}
Run Code Online (Sandbox Code Playgroud)
但GetProperty无法转换为查询.所以我正在考虑使用"propertyName"动态选择列.
protected override IQueryable<T> Execute<T>(IQueryable<T> original, string propertyName)
{
return RequestExactMatch()
? original.Where(o => GetColumnByName<string>(propertyName) == Name)
: …Run Code Online (Sandbox Code Playgroud) 连接两个表导致选择时间从330秒增加到40秒.要加入的表仅包含ID和文本.加入两张桌子时,我没想到选择时间会增加8倍.我的JOIN有什么问题,或者这是正常的SQL Server行为吗?
主表填充了3500万条记录,以查看在达到10 GB的SQL Server Express限制时它的执行情况.在字段LogTimeStamp和字段LogType上创建了另一个索引.
连接表的内容:

var queryList = messages
.Join(types,
type => type.LogType,
typeText => typeText.LogType, (msg, msgType) => new
{
msg.LogID,
msg.LogTimeStamp,
msg.LogUser,
msg.LogType,
msgType.LogTypeName,
msg.LogMessage
})
.Where(t => System.Data.Entity.DbFunctions.TruncateTime(t.LogTimeStamp) >= fromDate)
.Where(t => System.Data.Entity.DbFunctions.TruncateTime(t.LogTimeStamp) <= toDate)
.Where(t => t.LogType != 4)
.OrderBy(m => m.LogID)
.ToList();
Run Code Online (Sandbox Code Playgroud)
结果SQL
SELECT
1 AS [C1],
[Extent1].[LogID] AS [LogID],
[Extent1].[LogTimeStamp] AS [LogTimeStamp],
[Extent1].[LogUser] AS [LogUser],
[Extent1].[LogType] AS [LogType],
[Extent2].[LogTypeName] AS [LogTypeName],
[Extent1].[LogMessage] AS [LogMessage]
FROM [dbo].[AuditTrailMessages] AS [Extent1]
INNER JOIN [dbo].[AuditTrailLogTypes] AS …Run Code Online (Sandbox Code Playgroud)