2

我检查了其他问题,我相信这应该有效:

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' 方法的源参数必须是导航或集合属性

我想在继续之前我可以做一些建议。

编辑

我确实在客户端和服务器端都使用了 MaxProtocolVersion 3。

无论如何,这个特定的错误消息现在已经消失了,因为我不再尝试返回数据子集。我只是提前获得了完整的实体列表(尽管这需要进一步考虑/优化)。我错误地认为,如果我有一个空的临时 DataServiceContext,我将不得不检索我想要更新的实体,然后将它们保存回来(受我发现的执行更新的各种示例的影响)。当然AttachTo(EntitySetName, entity)方法是正确的解决方案。然后您可以在 TempContext.SaveChanges()之前调用UpdateObject(entity )

4

1 回答 1

0

从我了解到的情况来看,这种情况下的 LINQ 支持似乎是有限的,尽管我仍然不知道为什么 contains 在 DataServiceQuery 上不起作用。MSDN 文档表明它是受支持的。对 DataServiceContext 的查询以OData 格式解析 url :

http://services.odata.org/OData/OData.svc/Category(1)/Products ?$top=2&$orderby=name

我使用的解决方案 - 添加 WCF 数据服务操作/方法:

    [WebGet]
    public IQueryable<Thing> GetThingsByID(string ids)
    {
        return CurrentDataSource.Things.Where(x => ids.Contains(x.ThingID.ToString())).AsQueryable();
    }

以上应该允许我过滤:

WCF 数据服务操作

调用服务操作

我将 ids 作为 CSV 传递,因为只有原始数据类型可以作为参数传递

注意:包含在 DBContext 上的作品。

于 2013-09-13T09:33:01.463 回答