包含项目对上的匹配项

时间:2015-10-23 08:29:22

标签: c# .net linq

我有一个以下形式的映射表:

Id  ReferenceId  ReferenceType LinkId

要检索一组组合,我可以单独运行每个查询:

var pairs = new List<Pair>
{
    Pair.Create(1000, "Car"),
    Pair.Create(2000, "Truck"),
};
var maps = new List<Mapping>();
foreach (var pair in pairs)
{
    maps.AddRange(context.Mappings.Where(x => x.ReferenceId = pair.Id && x.ReferenceType == pair.Type).ToList());
}    

但是,我想将这些组合成一个语句来减少我对数据库的命中。是否有某种形式的Contains语句可以使用对象对?或者是否可以将OR子句附加到循环中的IQueryable上?还有其他解决方案吗?

2 个答案:

答案 0 :(得分:2)

不确定它是否适用于您的LINQ提供程序,但您可以尝试使用匿名类型加入:

var mapQuery = from p in pairs 
               join m in context.Mappings
               on new { p.Id, p.Type } equals new { m.ReferenceId, m.ReferenceType}
               select m;
List<Mapping> maps = mapQuery.ToList();

答案 1 :(得分:0)

您可以union一起查询。

这样的事情:

var pairs = new List<Pair>
{
    Pair.Create(1000, "Car"),
    Pair.Create(2000, "Truck"),
};

List<Mapping> result =
    pairs
    .Select(pair =>
        context.Mappings.Where(
            x => x.ReferenceId == pair.Id
            && x.ReferenceType == pair.Type))
    .Aggregate(Queryable.Union)
    .ToList();