2011-10-27 1 views
2

の定数値を作成できません。エラーは次のとおりです。 'mvcinfosite.ViewModels.GrpSearchHolder'タイプの定数を作成できません。このコンテキストでは、プリミティブ型( 'Int32、String、およびGuid'など)のみがサポートされています。式ツリーエラー:タイプ

このエラーを解決する方法を教えてください。 私は自分の問題を示すために例を挙げています。実際のプロジェクトでは、MyGrp1、MyGrp2、MyGrp3がListBoxに置き換えられています。私はそれを使用してデータをフィルタリングします。

 public class MyGroupHolder 
     { 
      public string GrpName { get; set; } 
      public List<int ?> ListSelectedGrpDescID { get; set; } 
     } 


     public ActionResult Index() 
     { 
      //Database Context 
      DBEntities db = EntityFactory.GetEntity(); 

      //Variables 
      List<MyGroupHolder> ListGrpHolder = new List<MyGroupHolder>(); 

      //Imagine a 3 listbox (MyGrp1,MyGrp2,MyGrp3) 
      //Each listbox contains selected value. 
      MyGroupHolder MyGrp1 = new MyGroupHolder(); 
      MyGrp1.GrpName = "Grp 1 Test"; 
      MyGrp1.ListSelectedGrpDescID = new List<int?>(); 
      MyGrp1.ListSelectedGrpDescID.Add(55); 


      MyGroupHolder MyGrp2 = new MyGroupHolder(); 
      MyGrp2.GrpName = "Grp 2 Test"; 
      MyGrp2.ListSelectedGrpDescID = new List<int?>(); 
      MyGrp2.ListSelectedGrpDescID.Add(56); 


      MyGroupHolder MyGrp3 = new MyGroupHolder(); 
      MyGrp3.GrpName = "Grp 3 Test"; 
      MyGrp3.ListSelectedGrpDescID = new List<int?>(); 
      MyGrp3.ListSelectedGrpDescID.Add(57); 

      ListGrpHolder.Add(MyGrp1); 
      ListGrpHolder.Add(MyGrp2); 
      ListGrpHolder.Add(MyGrp3); 

      //Getting a list of Locations base on the Group Filter 
      var ListLocation = db.Locations.Where(p => ListGrpHolder.Any(pg => pg.ListSelectedGrpDescID.Count == 0 || p.GroupLocations.Select(sg => sg.GrpDescID).Intersect(pg.ListSelectedGrpDescID).Any())).ToList(); 


      return View(); 
     } 

答えて

1

アプリケーションからlinq-to-entitiesクエリにオブジェクトを渡すことはできません。値を抽出して条件として渡す必要があります。

.Where(p => ListGrpHolder.Any(... 

どのようにLINQのツーエンティティクエリを実行する責任SQLサーバがListGrpHolderが何であるか(それはあなたのアプリケーションのメモリに住んでいる)とそれに含まれるどのような価値を知っている必要があります。ただ、問題を示してクエリの開始?

私はあなたのクエリとそれが何をすべきかを正確に理解していませんが、linq-to-entitiesとlinq-to-objectsの間で厳密に異なる必要があります。最初のものはSQLサーバー上で実行され、単純な型だけを照会することができます。 2番目はアプリケーションで実行され、オブジェクトとlinq構造を使用できますが、SQLサーバーからのデータを使用する場合は、最初にすべてをアプリケーションにロードしてアプリケーションのメモリにフィルタリングする必要がありますサーバ。

+0

クエリを有効な式に変換するカスタム式ツリーを使用する方法はありますか? –

0

db.Locations mycalculatedlocalids.Contains(l.id)は、Lを選択 にLから

を使用するようにクエリを変換します。

IQueryableにはプロバイダ情報が含まれており、IEnumerable(ListGrpHolder)には含まれていません。 これは、SQL Serverでクエリを実行できない理由です。

0

ラムダメソッドの代わりにLINQを使用するようにクエリを変換しました。クエリがLINQ構文で記述されていると、クエリを読みやすくなります。

db.Locationはどのようにしてpg.ListSelectedGrpDescID.Count == 0に関連しますか? db.Locationは0であれば何を返しますか?私は今質問のこの部分を外に出しました。

解決策を見つけようとするときに、問題を段階的に解消することをお勧めします。これはソリューションの第一歩です。

まず、ListGrpHolder IDを別のステートメントにリファクタリングすることができます。これにより、int値のみが返され、ListLocationクエリが読みやすくなります。

var SelectedIds = ListGrpHolder.Select(pg => pg.ListSelectedGrpDescID).SelectMany(i => i); 
var ListLocation = (from loc in db.Locations 
        from grp in loc.GroupLocations 
        where SelectedIds.Contains(grp.GrpDescID) 
        select loc).ToList(); 

必要な結果を得るためにクエリを簡略化または変更できない場合は、式ツリーを使用して調べることができます。

関連する問題