На самом деле, как только 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>();
Почему не только запрос Походные и затем льют результаты в базе? – stuartd
@stuartd: Благодарим за быстрый ответ. Конечно, Cast <> был первым, что я пробовал. В результате я получил эту ошибку: «Невозможно передать тип« Derived »для ввода« Base ». LINQ to Entities поддерживает только приведение типов примитивов EDM или перечислений». Это естественно, так как «База» никогда не хранится в EF, сохраняется только «Derived». –
Нет, нет простого способа выбрать только базовые столбцы. Но вы можете принять @stuartd совет. Не требуется 'Cast', просто' .AsEnumerable () 'в конце запроса. –