在具有空结果的 Linq to Sql 查询中获取默认值类型 (DateTime)

2024-01-17

我在返回默认值时遇到问题DateTime复合体的价值Linq-to-Sql query.

希望下面的简化示例能够显示问题(尽管我还没有运行这个确切的代码):

users.Select(u =>
  new MyDomainObject(
     u.Id,
     u.Transactions
        .Where(t => false) // empty results set
        .Select(t => t.TransactionTime) // TransactionTime is DATETIME NOT NULL
        .OrderByDescending(x => x)
        .FirstOrDefault() // I want DateTime.MinValue (or SqlDateTime.MinValue)
  )
); 

所以我想要最后一个时间戳,或者一些MinValue如果没有结果,则显示时间戳。

枚举上面的查询会给出错误

The null value cannot be assigned to a member with type System.DateTime

UPDATE

好吧,我不确定上面的例子是否足以说明问题。我相信该错误可能与我尝试在第三个链接表上执行子查询的方式有关。

以下示例重新创建了确切的错误:

所以我有一辆车,我可以把它带到机械师那里,有时(但并非总是)由机械师维修。

要求是找到通过查询 car 表自上次维修以来,每辆车已接受过多少次机械师上门服务。问题是当汽车从未维修过时,因此数据如下所示:

Car
------------- 
Id: 1         


MechanicVisit          
------------- 
Id: 1 
CarId: 1 
ServiceRecordId: NULL
VisitDate: 1 Jan 2011    


ServiceRecord
------------- 
<empty>

因此,显示错误的一个简单示例是获取上次服务时间列表的查询:

 var test = _dataContext.GetTable<Car>
                 .Select(c => 
                     c.MechanicVisits
                      .Select(m => m.ServiceRecord)
                      .Select(s => s.ServiceDate)
                      .OrderByDescending(d => d)
                      .FirstOrDefault()
                  ).ToList();

这给出了前面描述的尝试将 null 分配给不可为 null 的类型的错误,我需要做的是 returnDateTime.MinValue or SqlDateTime.MinValue当日期为空时(这样我可以进行实际查询,即自上次服务以来机械师访问的次数)


SOLUTION

我使用了 Jon Skeet 建议的变体,使用演员阵容DateTime?和空合并运算符:

 var test = _dataContext.GetTable<Car>
                     .Select(c => 
                         c.MechanicVisits
                          .Select(m => m.ServiceRecord)
                          .Select(s => (DateTime?)s.ServiceDate)
                          .OrderByDescending(d => d)
                          .FirstOrDefault() ?? new DateTime(1900, 1, 1)
                      ).ToList();

请注意“默认”日期的参数化构造函数的使用 -DateTime.MinValue不能在这里使用,因为它在转换为 SQL 时会抛出超出范围的异常,并且SqlDateTime.MinValue不能使用,因为它不可为空(因此合并运算符变得无效)。

我仍然不太明白为什么会发生最初的错误,并且这个解决方案确实感觉有点老套,但我一直无法找到任何更简洁的方法来修复它。


我很想actually使用可为空的DateTime为了这。例如,从您的“汽车”示例中:

var test = _dataContext.GetTable<Car>
                       .Select(c => 
                           c.MechanicVisits
                            .Select(m => m.ServiceRecord)
                            .Select(s => (DateTime?) s.ServiceDate)
                            .OrderByDescending(d => d)
                            .FirstOrDefault()
                       ).ToList();

这样我怀疑你最终会得到它working并给你 nullDateTime?价值观。如果您愿意,您可以随时对其进行转换:

var test = _dataContext.GetTable<Car>
                       .Select(c => 
                           c.MechanicVisits
                            .Select(m => m.ServiceRecord)
                            .Select(s => (DateTime?) s.ServiceDate)
                            .OrderByDescending(d => d)
                            .FirstOrDefault()
                       ).AsEnumerable()
                        .Select(dt => dt ?? DateTime.MinValue)
                        .ToList();

原始答案(不起作用)

唔。我不会声称完全理解其原因,但这里有一个潜在的解决方法:

users.Select(u =>
  new MyDomainObject(
     u.Id,
     u.Transactions
        .Where(t => false)
        .Select(t => t.TransactionTime)
        .OrderByDescending(x => x)
        .DefaultIfEmpty(DateTime.MinValue)
        .First()
  )
); 

换句话说,如果结果集为空,则使用指定的默认值 - 然后获取 now-definitely-not-empty 序列的第一个结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在具有空结果的 Linq to Sql 查询中获取默认值类型 (DateTime) 的相关文章

  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • 在 dockerfile 中运行可执行文件

    我是 Docker 新手 正在阅读 Turnbull 的 The Docker Book 本质上 我掌握了容器如何工作以及图像在传输协议和虚拟化操作系统中如何工作的术语和流程 但是 我的 dockerfile 没有运行本地可执行文件 并且我
  • 在 CMake 的构建工具模式下传递参数

    我有一组小的 C 程序要用来编译Nmake 我启动构建过程 cmake G NMake Makefiles cmake build buildDir and Nmake开始编译 问题是构建过程在出现第一个编译错误时停止 我想构建所有可以编译
  • 错误“条件长度 > 1 并且仅使用第一个元素”是什么意思? [复制]

    这个问题在这里已经有答案了 这是我的数据集 FullName lt c Jimmy John Cephus Frank Chester Hank Chester Brody Buck Clyde Merle Rufus Roscoe Jed
  • 根据使用 JavaScript 单击的按钮传递隐藏字段值

    我有一个带有两个按钮的表单 每个按钮都有 onclick this form submit 我的表单中有一个隐藏字段 我希望该字段的值根据单击的按钮而有所不同 最好的方法是什么 另外 在有人说出答案之前 在这种情况下 jQuery 不是一个
  • 使用默认搜索建议适配器时是否有办法限制显示建议的数量?

    如所述使用默认搜索建议适配器时 有没有办法限制显示建议的数量here https developer android com guide topics search adding recent query suggestions html
  • Git 克隆详细输出?

    我必须在 Dockerfile 中克隆几个大型存储库 克隆一个存储库确实需要一个小时 我想查看标准 Git 进度输出以了解发生了什么 但是 当从 Dockerfile 启动 Git 时 我看不到任何 git clone 输出 打印到控制台的
  • 如何阻止 Emacs“污染”剪贴板?

    Emacs 总是将终止 删除的内容复制到剪贴板 我经常需要将内容复制并粘贴到 Emacs 中 但是当我在粘贴之前从 Emacs 中删除现有内容时 我想要粘贴的内容就会丢失 我发现的唯一解决方案是使用 setq save interprogr
  • XML 和 XSLT 保留 CDATA

    我正在开发一个项目 其中包括在 xml 上应用一些 xslt 我的输入 xml 在任何 xml 节点中都包含 CDATA 现在我想要的是如果它有输入 它应该保留 CDATA 我尝试了很多解决方案 例如禁用输出转义和 cdata sectio
  • 在 `Row` 内渲染 ListTile 时出现错误 `Failedassertion: line 1687 pos 12: 'hasSize'`

    我在颤动中有以下代码 Widget build BuildContext context return Center child Card child Column mainAxisSize MainAxisSize min childre
  • 当返回类型不重要时,是否有更优雅的方法来合并可观察量?

    我有一个类似 ReactiveUI 的视图模型 它具有多种不同类型的属性 可以激发NotifyPropertyChanged事件 我想订阅一个在触发任何事件时将被调用的方法 但我对实际值不感兴趣 我当前的代码有点难看 由于不透明true选择
  • 从分叉的上游原点拉取时忽略特定文件

    在 git 中 从上游源 即原始项目 拉取时如何免除某些文件 我正在开发一个项目 该项目最初是从一个非常活跃的存储库中分叉出来的 我已将原始版本添加为名为 upstream 的远程版本 以便可以运行 git pull upstream 并将
  • CouchDB 只写数据库

    我正在尝试设置一个可公开写入且只能由 管理员 角色读取的 CouchDB 数据库 我怎样才能做到这一点 有没有类似的validate doc update访问文档的函数 查看这一页 http wiki apache org couchdb
  • Silverlight Windows Phone 7:手势事件?

    我正在 Expression Blend 中模拟 wp7 应用程序 并寻找设置事件处理程序来响应某些手势 一些 Bing ing 显示一些人建议使用 点击时 或其他东西并检查自己点击之间的时间 但似乎应该有一种更简单的方法 Silverli
  • PHP 生成 RGB

    我面临着这种情况 我有一个来自数据库的 ID 因此它可以是 1 100 1000 并且我需要生成随机颜色 但是相同的 ID 应该会产生相同的颜色 关于如何实现这一目标有什么建议吗 Thanks 使用加密哈希并剪切不需要的字节 functio
  • Laravel Homestead - 在哪里运行 npm(虚拟机与 Windows 10 主机)

    我正在 Windows 10 主机上运行 Laravel Homestead Vagrant 盒子 目前 我正在编译资产 运行npm run dev 在虚拟机内 有时它非常慢 而且我通常会遇到符号链接 运行观察程序等问题 简而言之 需要更多
  • 你能用 css 设置 html 表单按钮的样式吗?

    我不喜欢默认的按钮样式 真的很无聊 我在用
  • 如何修复“python 版本始终返回 2.7 而不是 3.7”

    我下载了 Python 3 7 3 但 Python 2 7 10 已经存在 Now python version返回 2 7 10 我怎样才能解决这个问题 如果您在 Linux 上工作 您可以随时输入python3 version检查它是
  • 从 select 标签内 ng-change 中的选项获取 $index

    我发现有很多与此类似的问题 但我找不到任何完全需要我所拥有的问题 ngRepeat 在选项标签内 选择标签内的 ngChange 我需要获取所选选项的索引 这是我的代码
  • 如何快速发现复杂场景中某个点是否被遮挡?

    我有一个复杂的 3D 场景 需要根据 3D 坐标在其上显示 HTML 元素 我只是简单地覆盖了一个div标签放在顶部并使用 CSS 定位 但是 当 3D 坐标被模型遮挡时 或者以另一种方式表述 当它在相机中不可见时 时 我还需要部分隐藏它
  • 在具有空结果的 Linq to Sql 查询中获取默认值类型 (DateTime)

    我在返回默认值时遇到问题DateTime复合体的价值Linq to Sql query 希望下面的简化示例能够显示问题 尽管我还没有运行这个确切的代码 users Select u gt new MyDomainObject u Id u