gpt4 book ai didi

.net - 如何以最佳方式合并 LINQ-to-SQL 查询

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

我已经解决了我的问题,但是因为我之前尝试过但没有解决,这次花了​​我很大的努力,我想发布这个问题,如果没有人有更好的答案,我的解决方案所以我不要忘记将来如何做到这一点,并帮助其他面临类似挑战的人。我的挑战是这样的:

我有一个函数用于过滤选项列表以仅返回那些被跟踪的选项,并且在适用时,也只显示与指定模式匹配的项目:

  Private Shared Function FilterResultsLot(ByVal source As IQueryable(Of Item), _
ByVal itemCode As String) As IQueryable(Of Item)
If HasFilter(itemCode, True) Then
Return From row In source Where row.ItemDetail.IsLotTraced AndAlso _
row.ItemCode.ToLower() Like itemCode.ToLower()
Else
Return From row In source Where row.ItemDetail.IsLotTraced
End If
End Function

出现了另一个要求,我希望能够将批处理跟踪标准推广到通用过滤器中,因此我创建了这个函数:
  Private Shared Function FilterResults(source As IQueryable(Of Item), _
itemCode As String, filter As Func(Of Item, Boolean)) As IQueryable(Of Item)
Dim predicate As Func(Of Item, Boolean)
If HasFilter(itemCode, True) Then
predicate = Function(row) row.ItemCode.ToLower() Like itemCode.ToLower() AndAlso filter.Invoke(row)
Else
predicate = filter
End If
Return source.Where(predicate).AsQueryable()
End Function

该函数通过 LINQ-to-SQL 工作,但它失去了重要的优化。而第一个函数将执行以以下结尾的 SQL 查询:
FROM [dbo].[OITM] AS [t0]
LEFT OUTER JOIN [dbo].[FSE_ItemDetail] AS [t1] ON [t1].[ItemCode] = [t0].[ItemCode]
WHERE ([t1].[IsLotTraced] = 1) AND (LOWER([t0].[ItemCode]) LIKE @p0 ESCAPE ''~'')

第二个将执行多个带有这些结尾的 SQL 查询(可能还有更多):
FROM [dbo].[OITM] AS [t0]

FROM [dbo].[FSE_ItemDetail] AS [t0]
WHERE [t0].[ItemCode] = @p0',N'@p0 nvarchar(4000)',@p0=N'BF-BIKE'

FROM [dbo].[FSE_ItemDetail] AS [t0]
WHERE [t0].[ItemCode] = @p0',N'@p0 nvarchar(4000)',@p0=N'BF-BIKE-ITEM'

所以问题是如何在不调用 Invoke 或 AsQueryable 或不失去最佳执行的情况下将 LINQ-to-SQL 委托(delegate)表达式组合成一个表达式。

最佳答案

这是我目前的解决方案。如果您有任何问题,请发表评论或提供更好的解决方案:

  Private Shared Function FilterResults(source As IQueryable(Of Item), itemCode As String, filter As Expressions.Expression(Of Func(Of Item, Boolean))) As IQueryable(Of Item)
If HasFilter(itemCode, True) Then
Return Queryable.Where(Queryable.Where(source, Function(row) row.ItemCode.ToLower() Like itemCode.ToLower()), filter)
Else
Return Queryable.Where(source, filter)
End If
End Function

编辑:

在使用它多一点之后,我更喜欢这种语法的简化/替代:
Return Queryable.Where(Queryable.Where(source, _
Function(row) row.ItemCode.ToLower() Like itemCode.ToLower()), filter)

我的偏好是:
Return Queryable.Where(From row in source _
Where row.ItemCode.ToUpper() Like itemCode.ToUpper(), filter)

(我还建议 ToUpper 而不是 ToLower 在区分大小写的服务器上强制进行不区分大小写的匹配,因为我听说 UPPER 对此进行了更好的优化。)

关于.net - 如何以最佳方式合并 LINQ-to-SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9689713/

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