8

LinqPad を使用してクエリをテストしています。このクエリは、LInqPad 接続がデータベース (LInq から SQL) に接続されている場合は機能しますが、Entity Framework 5 Model.dll を使用するように接続を変更すると機能しません。(Linq to Entity)。これはC#にあります。

Plan と PlanDetails という 2 つのテーブルがあります。関係は、1 つの Plan と複数の PlanDetails です。

var q = from pd in PlanDetails
        select new {
            pd.PlanDetailID,
            ThePlanName = (from p in this.Plans
                    where p.PlanID == pd.PlanID
                    select p.PlanName)
        };
var results = q.ToList();
q.Dump(); //This is a linqpad method to output the result.

「NotSupportedException: 'Domain.Data.Plan' 型の定数値を作成できません。このコンテキストでは、プリミティブ型または列挙型のみがサポートされています。」というエラーが表示されます。これがLinq to SQLでのみ機能する理由は何ですか?

4

4 に答える 4

20

基本的に、比較のためにクエリ内で複雑なデータ型を使用していることを意味します。あなたの場合from p in this.Plans where p.PlanID == pd.PlanID、犯人だと思います。

そしてそれはDataProviderに依存します。Sql データ プロバイダーでは機能する可能性がありますが、SqlCE データ プロバイダーなどでは機能しません。

あなたがすべきことは、this.Plansコレクションを Id のみを含むプリミティブ型のコレクションに変換することです。

var integers = PlanDetails.Plans.Select(s=>s.Id).ToList();

そして、このリストを内部で使用します。

var q = from pd in PlanDetails
        select new {
            pd.PlanDetailID,
            ThePlanName = (from p in integers
                    where p == pd.PlanID
                    select pd.PlanName)
        };
于 2013-03-23T21:15:49.603 に答える
5

エンティティ フレームワークの式でナビゲーション プロパティを null チェックしようとしたときに、このエラーが発生しました

式で not null チェックを使用せず、Any() 関数のみを使用して解決しました。

  protected Expression<Func<Entities.Employee, bool>> BriefShouldAppearInSearchResults(
        IQueryable<Entities.Employee> briefs, string username)
    {
       var trimmedUsername = NameHelper.GetFormattedName(username);

        Expression<Func<Entities.Employee, bool>> filterExpression = cse =>                
             cse.Employee.Cars.All(c => 
                 c.Employee.Cars!=null &&  <--Removing this line resolved my issue
                 c.Employee.Cars.Any(cur => cur.CarMake =="Benz")));

        return filterExpression;
    }

これが誰かを助けることを願っています!

于 2015-07-16T08:33:03.557 に答える
3

必要に応じて、これはLinqpadのバグです(または特殊性)。私自身も同様の行動を見つけました。私のように、クエリはで機能しますが、ObjectContextでは機能しない場合がありDbContextます。(そしてそれはVisualStudioで動作します)。

それはLinqpadの内部構造に関係していると思います。MergeAs (AppendOnly)コレクションに追加され、コンテキストは、UserQueryおそらくこのバグの原因となるコードが含まれています。

これは、Linqpadコードで新しいコンテキストインスタンスを作成し、このインスタンスに対してクエリを実行すると、コード機能するという事実によって確認されます。

于 2013-03-23T21:19:07.777 に答える
2

関係がすでに存在する場合。

簡単に言ってみませんか。

var q = from pd in PlanDetails
        select new {
            pd.PlanDetailID,
            ThePlanName = pd.Plan.PlanName
        };

もちろん、すべてのPlanDetailはプランに属すると想定しています。

アップデート

LinqPadからより良い結果を得るには、使用するデフォルトのDatacontextの代わりに、独自のアセンブリ(DbContextを含む)を使用するように指示できます。

于 2013-03-23T21:12:24.510 に答える