使用.contains()优化查询表达式

时间:2014-03-20 00:43:00

标签: linq lambda odata query-expressions

我有一个多对多表,它将一个对象与一个地方相关联,例如

1  1
2  1
4  3
5  9
6  2

我有许多地方的不同表,并且有几个表通过外键如地址簿条目和历史链接到它。我需要的是在MVC中向我的View发送一个集合的所有信息的集合,但前提是它是在我的多对多表中使用的地方,即在示例中放置1,3,9和2

所以现在我做两个查询

var places = myodataservice.Get(new QueryBuilder<MapTable>())
                           .Select(t => t.PlaceId)
                           .Distinct();

var returnable = myodataservice.Get(
    new QueryBuilder<Places>(),
    p => p.Address,
    p => p.Address.State,
    p => p.Logo
).Where(p => places.Contains(p.Id))

这非常慢,而且似乎是运行查询的一种可怕方式。有没有更好的方法来实现这一点,可能只有一个查询?

1 个答案:

答案 0 :(得分:0)

OData v4中的$ crossjoin可以解决您的问题,但目前它没有在WebApi中实现。但OData Unbound Function可以满足您的要求,下面是一个示例: http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataFunctionSample/FunctionSample/

假设你的函数名是GetReferencedThings(),那么你可以通过下面的url调用它:

〜/服务前缀/ GetReferencedThings()

在实现它时,您可以利用sql脚本获取不同的东西并返回到客户端。