Есть два класса с одинаковой структурой полей: WebMessage
и WebMessageDto
.
У меня есть DataGrid, который может работать с обоими классами. И у меня есть служба RIA, которая может предоставить только WebMessageDto
, потому что WebMessage
имеет свойства навигации и их нельзя сериализовать.
Теперь DataGrid должен запросить метод службы RIA, возвращающий IQueryable<WebMessageDto>
. Мне нужно обработать запрос DataGrid и выполнить его в ORM Table<WebMessage>
, затем преобразовать результат в тип WebMessageDto
и вернуть его в DataGrid.
Я начал реализовывать собственный интерфейс IQueryable и могу обрабатывать выражения.
public class WebMessageQueryContext
{
// Executes the expression tree that is passed to it.
internal static object Execute(Expression expression, bool isEnumerable)
{
// DataContext.WebMessages is a ORM table which returns IQueryable<WebMessage>
List<WebMessage> list = DataContext.WebMessages.Provider.Execute(expression);
return WebMessageDto.ConvertFrom(list); // returning List<WebMessageDto>
}
}
Приведенный выше код будет выполнять рекурсивные вызовы этого метода. И я нашел образец Microsoft, где запрашиваемый источник изменяется в ExpressionVisitor, и теперь я меняю исходный код на таблицу ORM.
protected override Expression VisitConstant(ConstantExpression c)
{
if (c.Type == typeof(WebMessageDtoQuerySource<WebMessageDto>))
return Expression.Constant(DataContext.WebMessages);
return c;
}
Я получаю исключение, когда выполняю выражение:
Expression of type 'System.Data.Linq.Table'1[WebMessage]' cannot be used for parameter of type 'System.Linq.IQueryable'1[WebMessageDto]' of method 'Int32 Count[WebMessageDto](System.Linq.IQueryable
1[WebMessageDto])'`
Про IQueryableProviders мало информации и что делать не знаю... Кто может ответить, теоретически можно?