Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ to Entities无法识别Boolean IsAssignableFrom方法_C#_Asp.net Mvc_Linq_Entity Framework - Fatal编程技术网

C# LINQ to Entities无法识别Boolean IsAssignableFrom方法

C# 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

我有一个扩展方法IsAssignableFrom

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));