【发布时间】:2014-06-20 11:26:34
【问题描述】:
有两个类具有相同的字段结构:WebMessage 和 WebMessageDto。
我有一个可以与这两个类一起使用的 DataGrid。而且我有一个 RIA 服务,它只能提供 WebMessageDto,因为 WebMessage 具有导航属性并且它们不能被序列化。
现在,DataGrid 应该查询返回 IQueryable<WebMessageDto> 的 RIA 服务方法。我需要处理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>
}
}
上面的代码将对这个方法进行递归调用。而且我发现了微软的示例,其中 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.IQueryable1[WebMessageDto])'`
关于IQueryableProviders的资料不多,也不知道怎么办……谁能回答,理论上可以吗?
【问题讨论】:
-
我可以为您提供该 LINQ 提供程序的帮助,但我不认为这是必要的。
this在上面的代码中有什么确切的静态类型?可能不是 IQueryable 而是 IEnumerable。 -
我使用 devExpress GridControl,它绑定到 IQueryable 集合以提供排序/过滤/分组。但是有一个限制 - GridControl 不能与实体一起使用,它只能与 dto 一起使用。
-
WebMessageDtos方法将所有数据库行加载到内存中,进行转换,然后执行外部 linq 查询。我只需要在内存中加载必要的行并将它们作为 dto 返回。 -
@usr 我想表达式有链接到它的原始 IQueryableProvider ,其中包含上面列出的
Execute方法。我可以将表达式的目标更改为 WebMessages 表吗? -
您使用的是哪个服务器模式数据源? Server Mode Concepts
标签: c# linq iqueryable