【问题标题】:LINQ contains on Nullable guid fieldLINQ 包含 Nullable guid 字段
【发布时间】:2023-03-31 07:19:02
【问题描述】:

我想为 'ids' 数组中的每个 QuestionID 选择最新的 DataItem 记录。 因为我不能在 LINQ 中使用 .Value,所以我将 id 转换为 Nullable。但是我现在得到一个 'Object must implement IConvertible'

表:数据项

------------------------------------
ID                  |   Guid        |
DataItemTimeLocal   |   DateTime    |
QuestionID          |   Guid?       |
------------------------------------

Guid?[] ids = GetAllQuestions().Select(x => (Guid?)x.ID).ToArray();
var latestItems = (from di in DataObjects.DataItems
                       where di.QuestionID != null && ids.Contains(di.QuestionID)
                       group di by di.QuestionID into g
                       select g.OrderByDescending(x => x.DataItemTimeLocal).FirstOrDefault()
           ).ToDictionary(x => x.QuestionID, y => y);

【问题讨论】:

  • 你需要重新设计你的查询,这样你就不需要在里面调用 Contains()
  • 为什么ids 需要是可为空的 guid?只需创建一个 Guid 数组并忽略空值,您的查询条件 (di.QuestionID != null) 无论如何都会丢弃它们。
  • @Adi:我已经通过遍历 id 并针对每个问题 id 进行查询来做到这一点,这是低效的,我正在寻找一种更好的方法,也许只需要一个查询。
  • @paul:是的 di.QuestionID != null 会丢弃,但我仍然不能使用下一部分。除非 id 可以为空
  • @user1984695 这确实是非常低效的,这不是要走的路

标签: c# .net mysql linq


【解决方案1】:
Guid[] ids = GetAllQuestions().Select(x => x.ID).ToArray();

var latestItems = (from di in DataObjects.DataItems
                   where di.QuestionID.HasValue && 
                         ids.Contains(di.QuestionID.Value)
                   group di by di.QuestionID into g
                   select g.OrderByDescending(x => x.DataItemTimeLocal)
                           .FirstOrDefault()
                   ).ToDictionary(x => x.QuestionID, y => y);

【讨论】:

  • 它会抛出一个错误。不支持成员访问“布尔 HasValue”。我之前对 .Value 也有同样的问题
  • @user1984695 看起来这是您的 mysql Linq 提供程序的问题。使用 Linq to Sql 都可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
相关资源
最近更新 更多