式ツリーエラー:型の定数値を作成できません

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

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

        public class MyGroupHolder
        {
            public string GrpName { get; set; }
            public List ListGrpHolder = new List();

            //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 ListGrpHolder.Any(pg => pg.ListSelectedGrpDescID.Count == 0 || p.GroupLocations.Select(sg => sg.GrpDescID).Intersect(pg.ListSelectedGrpDescID).Any())).ToList();


            return View();
        }
2

3 答え

アプリケーションからlinq-to-entitiesクエリにオブジェクトを渡すことはできません。値を抽出して条件として渡す必要があります。あなたの質問の始めに問題が示されます:

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

Linqからエンティティへの問合せを実行するSQLサーバーは、 ListGrpHolder (アプリケーションのメモリー内に存在するもの)とその値をどのように知るべきですか?

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

1
追加された
クエリを有効な式に変換するためのカスタム式ツリーを使用する方法はありますか?
追加された 著者 Jean-Francois,

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

db.Locationsのlから ここでmycalculatedlocalids.Contains(l.id) 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();

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

0
追加された