C# LINQ to Entities无法识别Boolean IsAssignableFrom方法
我有一个扩展方法IsAssignableFromC# LINQ to Entities无法识别Boolean IsAssignableFrom方法,c#,asp.net-mvc,linq,entity-framework,C#,Asp.net Mvc,Linq,Entity Framework,我有一个扩展方法IsAssignableFrom public static bool IsTypeOf<T>(this Type type) { return typeof (T).IsAssignableFrom(type); } 但是,当我使用它时,它会引发以下异常: {System.NotSupportedException: LINQ to Entities does not recognize the method
public static bool IsTypeOf<T>(this Type type)
{
return typeof (T).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}
{System.NotSupportedException:LINQ to Entities无法识别方法“Boolean IsAssignableFrom(System.Type)”方法,并且无法将此方法转换为存储表达式。
位于System.Data.Objects.Elink.ExpressionConverter.MethodCallTranslator.DefaultTranslator.Translate(ExpressionConverter父级,MethodCallExpression调用)
位于System.Data.Objects.Elink.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter父级,MethodCallExpression linq)
位于System.Data.Objects.Elink.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter父级,表达式linq)
位于System.Data.Objects.Elink.ExpressionConverter.TranslateExpression(表达式linq)
位于System.Data.Objects.elink.ExpressionConverter.TranslateLambda(LambdaExpression lambda,DbExpression input)
位于System.Data.Objects.eliq.ExpressionConverter.TranslateLambda(LambdaExpression lambda、DbExpression input、DbExpressionBinding&binding)
位于System.Data.Objects.Elink.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter父级、MethodCallExpression调用、DbExpression和source、DbExpressionBinding和sourceBinding、DbExpression和lambda)
位于System.Data.Objects.Elink.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter父级,MethodCallExpression调用)
位于System.Data.Objects.Elink.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter父级,MethodCallExpression调用,SequenceMethod SequenceMethod)
位于System.Data.Objects.Elink.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter父级,MethodCallExpression linq)
位于System.Data.Objects.Elink.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter父级,表达式linq)
位于System.Data.Objects.Elink.ExpressionConverter.TranslateExpression(表达式linq)
在System.Data.Objects.Elink.ExpressionConverter.Convert()中
位于System.Data.Objects.elink.elinkQueryState.GetExecutionPlan(可为null `1 forMergeOption)
位于System.Data.Objects.ObjectQuery`1.GetResults(可为null`1 forMergeOption)
位于System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator()
位于System.Data.Entity.Internal.Linq.InternalQuery`1.GetEnumerator()处
位于System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator()
在c:\Users\William Business\Desktop\TWB\enterprise dev\Hehe\Hehe.Daemon\Processors\hehehehe.cs中的MVCDaemon.Helpers.AwardBadgesProcessor.awardBadgesForeventViewed情境()中:第27行
在c:\Users\William Business\Desktop\TWB\enterprise dev\Hehe\Hehe.Daemon\Controllers\hehehe.cs:line 29}中的MVCDaemon.Controllers.AwardBadgesController.FromUnprocessedEvents()中
您需要的是:
var UnlockableBadges = DB.Badges.OfType<BadgeNumVotesOnItem>();
DB.Badges
表示持久层中的一个表,实体框架知道如何与之对话。Where
构造将由实体框架进行分析,以转换为持久层可以理解的内容。Badges
集将能够具体化(即:将记录转换为有意义的类)类Badge
很好,但数据库不会谈论BadgeNumVotesOnItem
,因此,实体框架无法对其进行太多处理
这样想:如果您直接连接到数据库,是否可以查询
BadgeNumVotesOnItem
?您要查找的是:
var UnlockableBadges = DB.Badges.OfType<BadgeNumVotesOnItem>();
DB.Badges
表示持久层中的一个表,实体框架知道如何与之对话。Where
构造将由实体框架进行分析,以转换为持久层可以理解的内容。Badges
集将能够具体化(即:将记录转换为有意义的类)类Badge
很好,但数据库不会谈论BadgeNumVotesOnItem
,因此,实体框架无法对其进行太多处理
可以这样想:如果您直接连接到数据库,是否可以查询BadgeNumVotesOnItem
?您可以尝试以下方法:
var Type = typeof(BadgeNumVotesOnItem);
var UnlockableBadges = DB.Badges.OfType<BadgeNumVotesOnItem>();
然后它将构造一个SQL查询,返回所有徽章,然后应用Where表达式。不要尝试将where表达式转换为SQL查询,而由您使用的任何SQL引擎执行。您可以尝试以下操作:
var Type = typeof(BadgeNumVotesOnItem);
var UnlockableBadges = DB.Badges.OfType<BadgeNumVotesOnItem>();
然后它将构造一个SQL查询,返回所有徽章,然后应用Where表达式。而不是尝试将where表达式转换为SQL查询,以便由您使用的任何SQL引擎执行。SQL没有.Net类型和方法的概念。当EF试图将谓词转换为SQL时,它不知道该做什么。您想实现什么?我只希望类的子类型的项都是在您的上下文中定义的子类?SQL没有.Net类型和方法的概念。当EF试图将谓词转换为SQL时,它不知道该做什么。您想实现什么?我只希望类的子类型的项都是在您的上下文中定义的子类?这是正确的(如果上下文中未定义
BadgeNumVotesOnItem
)。但是您应该使用AsEnumerable()
让实体框架具体化查询,而不必创建不必要的数组,因为您正在查询它。您如何在上下文中定义它?现在只是继承而已。上下文中仅定义了正确的徽章(如果上下文中未定义BadgeNumVotesOnItem
)。但是您应该使用AsEnumerable()
让实体框架具体化查询,而不必创建不必要的数组,因为您正在查询它
var Type = typeof(BadgeNumVotesOnItem);
var UnlockableBadges = DB.Badges.AsEnumerable().Where(t => t.GetType().IsAssignableFrom(Type));