2016-08-10 2 views
1

У меня есть базовый класс, унаследованный от другого класса:Базовый тип запроса в Entity Framework

class Base { } 
class Derived : Base { } 

Entity Framework хранит только экземпляры производного класса. Я хочу выбрать только столбцы, соответствующие полям базового класса, и вернуть их как IEnumerable<Base>. Есть простой способ сделать это?

+1

Почему не только запрос Походные и затем льют результаты в базе? – stuartd

+0

@stuartd: Благодарим за быстрый ответ. Конечно, Cast <> был первым, что я пробовал. В результате я получил эту ошибку: «Невозможно передать тип« Derived »для ввода« Base ». LINQ to Entities поддерживает только приведение типов примитивов EDM или перечислений». Это естественно, так как «База» никогда не хранится в EF, сохраняется только «Derived». –

+1

Нет, нет простого способа выбрать только базовые столбцы. Но вы можете принять @stuartd совет. Не требуется 'Cast', просто' .AsEnumerable () 'в конце запроса. –

ответ

2

На самом деле, как только Base типа не распознаются как лица от EF (потому что по какой-то причине она не позволяет проецирование типов сущностей), вы можете использовать следующий простой помощник от моего ответа на c# How can I create a collection of custom objects without going through each field:

public static class QueryableExtensions 
{ 
    public static IQueryable<TResult> SelectTo<TResult>(this IQueryable source) 
    { 
     var sourceType = source.ElementType; 
     var resultType = typeof(TResult); 
     var parameter = Expression.Parameter(sourceType, "x"); 
     var bindings = 
      from rm in resultType.GetProperties().Concat<MemberInfo>(resultType.GetFields()) 
      join sm in sourceType.GetProperties().Concat<MemberInfo>(sourceType.GetFields()) 
       on rm.Name equals sm.Name 
      select Expression.Bind(rm, Expression.MakeMemberAccess(parameter, sm)); 
     var body = Expression.MemberInit(Expression.New(resultType), bindings); 
     return source.Provider.CreateQuery<TResult>(Expression.Call(
      typeof(Queryable), "Select", new[] { sourceType, resultType }, 
      source.Expression, Expression.Quote(Expression.Lambda(body, parameter)))); 
    } 
} 

так:

IQueryable<Derived> yourQuery = ...; 
return yourQuery.SelectTo<Base>(); 
Смежные вопросы