0
ユーザが選択した(レポートする)パラメータに基づいてlinqクエリを作成しようとしましたが、正しく機能していません...要求されたフィルタ結果セットの代わりにテーブル全体が読み込まれます。私が使用しているコードは次のとおりです。EF +ラムダ式を使用した動的クエリ
Public Sub GetResults()
Using ctx As New ReportingEntities()
Dim results As IQueryable(Of Orders) = ctx.Orders
' get reason params
If lbReason.GetSelectedIndices().Count() > 0 Then
Dim reasons = (From i As ListItem In lbReason.Items
Where i.Selected
Select Integer.Parse(i.Value)).ToList()
If reasons IsNot Nothing Then
Dim where =
CommonDataUtils.BuildOrExpressionTree(Of Orders, Integer)(reasons,
Function(r) r.ID)
results.Where(where)
End If
End If
' get commodity params
If lbCommodity.GetSelectedIndices().Count() > 0 Then
Dim comms = (From i As ListItem In lbCommodity.Items
Where i.Selected
Select i.Value).ToList()
If comms IsNot Nothing Then
Dim where =
CommonDataUtils.BuildOrExpressionTree(Of Orders, String)(_
DirectCast(comms, IEnumerable(Of String)),
Function(r) r.Affected_Commodity)
results.Where(where)
End If
End If
' get disposition params
If lbDisposition.GetSelectedIndices().Count() > 0 Then
Dim disps = (From i As ListItem In lbDisposition.Items
Where i.Selected
Select Integer.Parse(i.Value)).ToList()
If disps IsNot Nothing Then
Dim where =
CommonDataUtils.BuildOrExpressionTree(Of Orders, Integer)(_
disps,
Function(r) r.ID)
results.Where(where)
filter.Add(where)
End If
End If
' get facility params
If lbProdFacility.GetSelectedIndices().Count() > 0 Then
Dim facs = (From i As ListItem In lbProdFacility.Items
Where i.Selected
Select Integer.Parse(i.Value)).ToList()
If facs IsNot Nothing Then
Dim where =
CommonDataUtils.BuildOrExpressionTree(Of Orders, Integer)(facs,
Function(r) r.ID)
results.Where(where)
filter.Add(where)
End If
End If
' get customer number params
Dim custnums As List(Of Integer) = If(ViewState("cust_nums") Is Nothing, Nothing, ViewState("cust_nums"))
If custnums IsNot Nothing AndAlso custnums.Count > 0 Then
Dim where = CommonDataUtils.BuildOrExpressionTree(Of Orders, Integer) _
(custnums, Function(i) i.ID)
results.Where(where)
filter.Add(where)
End If
' get reason code params
Dim resnums As List(Of Integer) = If(ViewState("res_nums") Is Nothing, Nothing, ViewState("res_nums"))
If resnums IsNot Nothing AndAlso resnums.Count > 0 Then
Dim where = CommonDataUtils.BuildOrExpressionTree(Of Orders, Integer) _
(resnums, Function(i) i.ID)
results.Where(where)
filter.Add(where)
End If
' get date params
If IsDate(startDate.Value.Trim()) And IsDate(endDate.Value.Trim()) Then
Dim sdate As DateTime
Dim edate As DateTime
DateTime.TryParse(startDate.Value.Trim(), sdate)
DateTime.TryParse(endDate.Value.Trim(), edate)
If edate > sdate Then
Dim dateWhere As Expression(Of Func(Of Orders, Boolean)) =
Function(d) (d.Date_Rejected >= sdate And d.Date_Rejected <= edate)
results.Where(dateWhere)
filter.Add(dateWhere)
End If
' populate results grid
grd.DataSource = results
grd.DataBind()
End Using
End Sub
私もCommonDataUtils.BuildOrExpressionTree方法を含めることができます - それがないすべての値のリストを取得し、複数のparamsにそれらを有効にし、式を作成します。それは正常に動作します。面白いのは、CommonDataUtils.BuildOrExpressionTreeから返されたすべての式を.where(exp).where(exp2)などにチェーンすると、クエリが正常に動作することです。 – bbqchickenrobot
デバッグモードでコードをステップ実行するとどうなりますか?あなたが期待している場所に行き、あなたが期待するクエリ式を生成していますか?あなたは少し問題を絞り込むことができます任意のチャンス?このサイズのコードスニペットを読むと、お互いに無料でお手伝いしてくれる人がたくさんあります。 – StriplingWarrior