我已经检查了其他问题,我相信这应该有效:
private static List<Duck> GetDucks(this DataServiceContext ctx, params int[] ids)
{
return ctx.CreateQuery<Duck>("Ducks").Where(x => ids.Contains(x.DuckID)).ToList();
}
我收到了 NotSupportedException:不支持“包含”方法。
我将查询更改为
Where(x => ids.Any(id => id == x.DuckID)
我收到了以下消息:当MaxProtocolVersion小于'3.0 '时,不支持'Any'方法
然后我以不同的方式构造了DataServiceContext:
public static DataServiceContext Context
{
get { return new DataServiceContext(baseUri, DataServiceProtocolVersion.V3); }
}
然后我收到了消息: NotSupportedException:'Any'方法的source参数必须是导航或集合属性
我认为在继续前进之前我可以提供一些建议。
修改
我确实在客户端和服务器端使用了MaxProtocolVersion 3。
在任何情况下,此特定错误消息现在已消失,因为我不再尝试返回数据子集。我只需要预先获得完整的实体列表(尽管这需要进一步考虑/优化)。我错误地认为,如果我有一个空的临时DataServiceContext,我将不得不检索我想要更新的实体,然后将它们保存回来(受到我发现的更新执行更新的各种示例的影响)。当然,方法 AttachTo(EntitySetName,entity)是正确的解决方案。然后,您可以在 TempContext.SaveChanges()之前调用 UpdateObject(entity)。
答案 0 :(得分:0)
从我学到的内容看起来,这种情况下的LINQ支持是有限的,尽管我仍然不知道为什么包含不适用于DataServiceQuery。 MSDN文档表明它受支持。对DataServiceContext的查询解析OData format中的URL:
http://services.odata.org/OData/OData.svc/Category(1)/Products $顶部= 2&安培; $的OrderBy =名称
我使用的解决方案 - 添加WCF数据服务操作/方法:
[WebGet]
public IQueryable<Thing> GetThingsByID(string ids)
{
return CurrentDataSource.Things.Where(x => ids.Contains(x.ThingID.ToString())).AsQueryable();
}
以上应该允许我过滤:
我将id作为CSV传递,因为只有原始数据类型可以作为参数传递
注意: 包含DBContext上的工作。