ope*_*wix 6 c# linq iqueryable
有两个具有相同字段结构的类:WebMessage
和WebMessageDto
.
我有一个可以同时使用这两个类的DataGrid.我有一个RIA服务只能提供WebMessageDto
,因为WebMessage
有导航特性,它们不能被序列化.
现在,DataGrid应该查询返回的RIA Service方法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>
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将对此方法进行递归调用.我发现了microsoft的示例,其中可查询的源代码在ExpressionVisitor中发生了变化,现在我将原始源更改为ORM的表.
protected override Expression VisitConstant(ConstantExpression c)
{
if (c.Type == typeof(WebMessageDtoQuerySource<WebMessageDto>))
return Expression.Constant(DataContext.WebMessages);
return c;
}
Run Code Online (Sandbox Code Playgroud)
我执行表达式时遇到异常:
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的信息,我不知道该怎么做......谁能回答,我能从理论上做到吗?
对不起各位,我错了。在问题编辑之前,我写了Select
应用于IQueryable
之前Where
导致将所有表行加载到内存中然后执行Where
语句。但实际上这种行为是由于自定义 linq 提供程序的错误实现引起的。
当我在没有自定义 linq 提供程序的情况下使用 datagrid 时,我提到即使在before 应用时Select
也会执行 after 。Where
Select
Where
在我的代码中:
public IQueryable<WebMessageDto> Dtos
{
get { return db.WebMessages.Select(r => new WebMessageDto { Id = r.Id });}
}
Run Code Online (Sandbox Code Playgroud)
我的 DataGrid 使用语句查询此方法Where/OrderBy/GroupBy
,并WebMessageDto
在语句之后进行转换。
所以,Alex Key的答案也是适用的。
归档时间: |
|
查看次数: |
1200 次 |
最近记录: |