gpt4 book ai didi

vb.net linq查询where子句中的iif条件

转载 作者:行者123 更新时间:2023-12-02 08:50:44 25 4
gpt4 key购买 nike

以下查询有什么问题,我收到此错误:可空对象必须有一个值。

  Dim subscriptionUsers = From inv In dataContext.Invoices.ToList Join u In dataContext.Users _
On inv.Subscription Equals u.Subscription _
Where inv.Id.Value = invoiceID _
And Not u.Fund.Title.Contains("AGM") _
And DirectCast(IIf(Not u.EndDate.HasValue, IIf(u.StartDate.Value <= inv.EndDate.Value, True, False), _
IIf((u.StartDate.Value >= inv.StartDate.Value And u.StartDate.Value <= inv.EndDate.Value) Or _
(u.EndDate.Value >= inv.StartDate.Value And u.EndDate.Value <= inv.EndDate.Value) Or _
(u.StartDate.Value < inv.StartDate.Value And u.EndDate.Value > inv.EndDate.Value), True, False)), Boolean) _
Group By Key = u.Fund.Title Into Group _
Select Fund = Key, UsersCount = Group.Count, Users = Group.ToList, _
SubFunds = (From a In dataContext.Allocations Where a.Fund.Title = Key Select a.Department.Title Distinct)

如果我删除条件中的 u.EndDate.Value 那么它工作正常。

这是堆栈跟踪:

在 System.Nullable1.get_Value()
在 SDBReports.InvoiceAllocationReportUserControl._Lambda$__4(VB$AnonymousType_0
2 $VB$It) 在 System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext()
在 System.Linq.Lookup
2.Create[TSource](IEnumerable1 源、Func2 keySelector、Func2 elementSelector、IEqualityComparer1 比较器) 在 System.Linq.GroupedEnumerable4.GetEnumerator()
在 System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext() 在 System.Linq.SystemCore_EnumerableDebugView`1.get_Items()

附:我已使用 SPMetal 在 SharePoint 列表上生成实体类。

为了更清楚:

不要与 u.EndDate.Value 和 inv.EndDate.Value 混淆

这是 u.EndDate.Hasvalue 的真实部分:

 IIf((u.StartDate.Value >= inv.StartDate.Value And u.StartDate.Value <= inv.EndDate.Value) Or _
(u.EndDate.Value >= inv.StartDate.Value And u.EndDate.Value <= inv.EndDate.Value) Or _
(u.StartDate.Value < inv.StartDate.Value And u.EndDate.Value > inv.EndDate.Value), True, False)

这是错误的部分

IIf(u.StartDate.Value <= inv.EndDate.Value, True, False)

最佳答案

  • 使用If而不是IIf。这是短路的(就像 C# 的条件运算符),并且会起作用,因为条件if HasValueTrue. IIf 已弃用。切勿使用它。

  • 此外,像 If(condition, True, False) 这样的表达式是无意义的。仅将其替换为条件

  • 最后,您需要再次使用 AndAlso 而不是 And,以免发生短路。事实上,总是在条件语句中使用 AndAlsoOrElse在进行位运算时使用 AndOr

  • DirectCast 也是不必要的。

这给我们留下了一个更加简化的表达式:

If(Not u.EndDate.HasValue, u.StartDate.Value <= inv.EndDate.Value), _
(u.StartDate.Value >= inv.StartDate.Value AndAlso u.StartDate.Value <= inv.EndDate.Value) OrElse _
(u.EndDate.Value >= inv.StartDate.Value AndAlso u.EndDate.Value <= inv.EndDate.Value) OrElse _
(u.StartDate.Value < inv.StartDate.Value AndAlso u.EndDate.Value > inv.EndDate.Value))

但是这个表达式还是太复杂了。您应该将其拆分,但首先在查询中使用 Let 将可空值内的值分配给某个临时变量。

关于vb.net linq查询where子句中的iif条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7193997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com