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 是 Badge 的子类,并且两者都在您的实体框架映射中定义(或在您的数据库上以 TPT/TPH 方式)。

否则,这是不可能的,因为 SQL 不了解未映射到表的 .Net 类。

*编辑:你不能仅仅因为它继承了你的模型就使用它。因为您正在混合与数据库中的某些内容(EF 理解并可以用来与数据库对话)具有有意义关系的对象以及仅存在于您的应用程序中的某些内容。你不能混搭。在使用 EF 实现 LINQ 查询之前,所有事情都必须以您在上下文中定义的模型的心态来完成。

让我们接受您的查询:

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

DB.Badges表示持久层中的一个表,Entity Framework 知道如何与它对话。该Where构造将由 Entity 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 回答