0

拡張メソッド IsAssignableFrom があります

public static bool IsTypeOf<T>(this Type type)
        {
            return typeof (T).IsAssignableFrom(type);
        }

これは次のように呼び出されます:

var Type = typeof(BadgeNumVotesOnItem);    
var UnlockableBadges = DB.Badges.Where(t => t.GetType().IsAssignableFrom(Type));

ただし、使用すると、次の例外がスローされます。

{System.NotSupportedException: LINQ to Entities does not recognize the method 'Boolean IsAssignableFrom(System.Type)' method, and this method cannot be translated into a store expression.
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.Convert()
   at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
   at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
   at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
   at System.Data.Entity.Internal.Linq.InternalQuery`1.GetEnumerator()
   at System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator()
   at MVCDaemon.Helpers.AwardBadgesProcessor.AwardBadgesForEventViewedSituation() in c:\Users\William-Business\Desktop\TWB\Entrepreneurial dev\Hehe\Hehe.Daemon\Processors\hehehe.cs:line 27
   at MVCDaemon.Controllers.AwardBadgesController.FromUnprocessedEvents() in c:\Users\William-Business\Desktop\TWB\Entrepreneurial dev\Hehe\Hehe.Daemon\Controllers\hehehe.cs:line 29}
4

2 に答える 2

3

あなたが探しているものは次のとおりです。

var UnlockableBadges = DB.Badges.OfType<BadgeNumVotesOnItem>();

1) BadgeNumVotesOnItem は Badges のサブクラスであり、どちらも Entity Framework マッピング (またはデータベースの TPT/TPH 方式) で定義されていると仮定します。

それ以外の場合、SQL はテーブルにマップされていない .Net クラスを認識していないため、不可能です。

*編集:モデルを継承しているという理由だけで使用することはできません。データベース内の何か (EF が理解し、データベースと対話するために使用できるもの) と意味のある関係を持つオブジェクトと、アプリケーションだけに存在するオブジェクトを混在させているためです。混ぜ合わせることはできません。EF を使用して LINQ クエリを具体化する前に、コンテキストで定義したモデルの考え方ですべてを行う必要があります。

あなたのクエリを見てみましょう:

DB.Badges.Where(t => t.GetType().IsAssignableFrom(Type));

DB.Badges永続化レイヤーのテーブルを表し、Entity Framework はそれと対話する方法を知っています。コンストラクトはWhereEntity Framework によって分析され、永続化レイヤーが理解できるものに変換されます。セットはBadgesクラスを具体化する (つまり、レコードを意味のあるクラスに変換する) ことができBadgeますが、データベースは話さないBadgeNumVotesOnItemため、Entity Framework はそれをあまり処理できません。

次のように考えてください。データベースに直接接続する場合、クエリを実行できますBadgeNumVotesOnItemか?

于 2013-06-30T22:53:06.460 に答える
1

これを試すことができます:

var Type = typeof(BadgeNumVotesOnItem); 
var UnlockableBadges = DB.Badges.OfType<BadgeNumVotesOnItem>();

コンテキストにクラスが定義されていない場合などは、次のようにすることができます。

var Type = typeof(BadgeNumVotesOnItem);    
var UnlockableBadges = DB.Badges.AsEnumerable().Where(t => t.GetType().IsAssignableFrom(Type));

次に、すべてのバッジを返す SQL クエリを作成し、Where 式を適用します。where 式を、使用している SQL エンジンによって実行される SQL クエリに変換しようとする代わりに。

于 2013-06-30T22:53:20.600 に答える