.net - 是否有一种通用方法来检查 Linq 提供程序(尤其是 OData)是否支持某个属性定义?

标签 .net linq odata

我在 LinqPad 中使用 NorthWind.sdf 成功运行了以下语句:

from s in Shippers
    select new
{
    s.ShipperID,
    s.CompanyName,      
    Count=s.ShipViaOrders.Count()       
}

同时,我在 LinqPad 中使用 Odata 服务(http://services.odata.org/northwind/northwind.svc)运行类似的语句失败:
from s in Shippers    
select new
{
    s.ShipperID,
    s.CompanyName,      
    Count=s.Orders.Count()      
}

错误是“不支持使用表达式 s.Orders.Count() 构造或初始化 <>f__AnonymousType0`3[System.Int32,System.String,System.Int32] 类型的实例。”。

我知道 Linq 支持中的 OData 服务非常有限。我的应用程序中有动态 Linq 语句支持。实际上我正在尝试将数据源从 Compact SQL Server 迁移到 OData 服务。

所以我必须以一般的方式处理 NotSupportedException。目前,我尝试在运行之前检查propertydefine的语法,例如
"s.Orders.Count() as Count"   

它通过了我的检查,但遇到了 OData 的 NotSupportedException。

有没有办法检查 Linq 提供程序是否支持属性定义(通过字符串或 lambda)?

任何建议表示赞赏。

最佳答案

不幸的是,没有通用的编程方法来检查 LINQ 提供程序是否能够翻译任何给定的查询。通常,您将不得不求助于文档或(可以肯定)在您正在执行的过程中实际尝试查询。

然而,不同的提供者可能会提供一些为查询生成某种表示的机制,您可以使用它来检查查询是否可以工作而不必执行它。

在 OData 客户端情况下,您可以在查询上调用 .ToString(),如果它能够成功处理查询,它应该返回一个 URL;否则它将返回一条错误消息,类似于“将 Linq 表达式转换为 URI 时出错:...”(实际的错误消息可能会因用户语言而异,但它肯定不是有效的 URI)。

关于.net - 是否有一种通用方法来检查 Linq 提供程序(尤其是 OData)是否支持某个属性定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3091652/

相关文章:

.net - 使用 XmlSerializer 读取 UTF-16 编码的 XML 文件

.net - 如何修复连接到 SQL Server : SSL Provider, 错误:0 - 收到的消息意外或格式错误

c# - default(CancellationToken) 如何有相应的 CancellationTokenSource

c# - LINQ 身份函数

java - 尝试连接到数据市场返回异常

c# - 如何在 Socket 类中使用动态端口?

asp.net-mvc - 保存 dbml 后,Linq DataContext 类无法在我的 MVC 中访问

c# - linq 需要很长时间才能通过 datediff 订购

entity-framework - net core odata put和patch嵌套数据结构

javascript - 如何使用 Breeze 查询常规可查询 WebApi 端点?