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

Linq 使用.contains()优化查询表达式,linq,lambda,odata,query-expressions,Linq,Lambda,Odata,Query Expressions,例如,我有一个多对多表,它将一个对象与一个位置关联起来 1 1 2 1 4 3 5 9 6 2 我有一个包含许多地方的不同表,有几个表通过外键链接到其中,比如地址簿条目和历史记录。我需要的是在MVC中将一个位置的所有信息的集合发送到我的视图中,但前提是该位置是我的多对多表中使用的位置,即示例位置1、3、9和2 所以现在我做两个查询 var places = myodataservice.Get(new QueryBuilder<MapTable>())

例如,我有一个多对多表,它将一个对象与一个位置关联起来

1  1
2  1
4  3
5  9
6  2
我有一个包含许多地方的不同表,有几个表通过外键链接到其中,比如地址簿条目和历史记录。我需要的是在MVC中将一个位置的所有信息的集合发送到我的视图中,但前提是该位置是我的多对多表中使用的位置,即示例位置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))
var places=myodataservice.Get(新QueryBuilder())
.Select(t=>t.PlaceId)
.Distinct();
var returnable=myodataservice.Get(
新建QueryBuilder(),
p=>p.地址,
p=>p.Address.State,
p=>p.标志
).Where(p=>places.Contains(p.Id))

这两种方式都非常慢,而且似乎是一种可怕的查询方式。有没有更好的方法可以通过一个查询来实现这一点?

OData v4中的$crossjoin可以解决您的问题,但目前它没有在WebApi中实现。但是OData Unbound函数可以满足您的要求,下面是一个示例:

假设函数名为GetReferencedThings(),则可以通过以下url调用它:

~/service prefix/GetReferencedThings()


在它的实现中,您可以利用sql脚本获取不同的内容并返回到客户机

我不太确定,但是你能试试.Any(p=>places.Contains(p.Id))而不是.Where(p=>places.Contains(p.Id))吗?