我在LinqPad中使用NorthWind.sdf成功运行了以下语句:
from s in Shippers
select new
{
s.ShipperID,
s.CompanyName,
Count=s.ShipViaOrders.Count()
}
Run Code Online (Sandbox Code Playgroud)
与此同时,我没有在LinqPad中与Odata Service(http://services.odata.org/northwind/northwind.svc)进行类似的声明:
from s in Shippers
select new
{
s.ShipperID,
s.CompanyName,
Count=s.Orders.Count()
}
Run Code Online (Sandbox Code Playgroud)
错误是"构造或初始化类型<> f__AnonymousType0`3 [System.Int32,System.String,System.Int32]的实例,不支持表达式s.Orders.Count()."
我知道在Linq支持中OData服务非常有限.我在我的应用程序中有动态的Linq语句支持.实际上我正在尝试将数据源从Compact SQL Server迁移到OData服务.
所以我必须以一般方式处理NotSupportedException.目前,我尝试在运行之前检查属性define的语法,例如
"s.Orders.Count() as Count"
Run Code Online (Sandbox Code Playgroud)
它通过了我的检查,但它遇到了OData的NotSupportedException.
有没有办法检查Linq提供程序是否支持属性定义(通过字符串或lambda)?
任何建议表示赞赏.
英
小智 6
遗憾的是,没有通用的编程方法来检查LINQ提供程序是否能够翻译任何给定的查询.通常,您必须使用文档或(确定)实际尝试查询.
但是,不同的提供程序可以提供一些为查询生成一些表示的机制,您可以使用它来检查查询是否可以在不执行查询的情况下工作.
在OData客户端的情况下,您可以在查询上调用.ToString(),如果它能够成功处理查询,它应该返回一个URL; 否则它将返回一个类似于'错误将Linq表达式转换为URI:...'的错误消息(实际的错误消息可能会根据用户语言而改变,但它肯定不是有效的URI).