2011-08-09 23 views
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 
+0

私もCommonDataUtils.BuildOrExpressionTree方法を含めることができます - それがないすべての値のリストを取得し、複数のparamsにそれらを有効にし、式を作成します。それは正常に動作します。面白いのは、CommonDataUtils.BuildOrExpressionTreeから返されたすべての式を.where(exp).where(exp2)などにチェーンすると、クエリが正常に動作することです。 – bbqchickenrobot

+0

デバッグモードでコードをステップ実行するとどうなりますか?あなたが期待している場所に行き、あなたが期待するクエリ式を生成していますか?あなたは少し問題を絞り込むことができます任意のチャンス?このサイズのコードスニペットを読むと、お互いに無料でお手伝いしてくれる人がたくさんあります。 – StriplingWarrior

答えて

1

LINQクエリは文字列のように不変です。

s + " world" 

...実際にsの値を変更しません:これはどのように覚えていますか? LINQクエリと同じ方法で動作します。

results.Where(where) 

...クエリを変更しません。あなたは探している可能性があります:

results = results.Where(where) 
+0

Thxの戦士!それは完全に見落とされました! – bbqchickenrobot

関連する問題