LINQ中的LEFT JOIN介于dbContext和InMemory List之间

时间:2015-10-14 04:47:00

标签: c# entity-framework linq join

我的tagNumbers属于List<string>类型。我需要在此列表上使用数据库进行左连接。目前,当我在数据库上开始跟踪时,我看到很多查询被触发,因为此列表中没有任何记录。此LINQ查询在使用LEFT JOIN时也会出错,即lj.DefaultIfEmpty(),因为对于某些记录,如果LEFT JOIN为l.TagId将为NULL

即。 SELECT * FROM tagNumbers LEFT JOIN TagCollections ON.....LEFT JOIN...

from t in tagNumbers
join tc in dbContext.TagCollections on t equals tc.TagNumber into lj
from l in lj.DefaultIfEmpty()
join m in dbContext.MapTagEntities on l.TagId equals m.TagId    
select new GetItemByTagnumberResponse
{
   //DO SOMETHING
}
  1. 无论我的列表有多长,我应该如何确保只对数据库触发一个查询。
  2. 如何更正我的LEFT JOIN以获得例外
  3. 错误 Object reference not set to an instance of an object上的join m in dbContext.MapTagEntities on l.TagId equals m.TagId l.TagId因为&#34; l&#34;在LEFT JOIN的情况下为NULL,其中连接条件不匹配。

1 个答案:

答案 0 :(得分:0)

这可以使用GroupJoin完成。这是一个简单的实现。

        // When
        var results = fruitIds
            .GroupJoin(db.Fruits, id => id, fruit => fruit.Id, (id, fruits) => new
            {
                id = id,
                fruit = fruits.FirstOrDefault()
            })
            .GroupJoin(db.Attributes, f => f.fruit != null ? f.fruit.Id : 0, att => att.Id, (fruitContainer, attributes) => new
            {
                id = fruitContainer.id,
                fruit = fruitContainer.fruit,
                attribute = attributes.FirstOrDefault()
            })
            .ToList();

        // Then
        Assert.AreEqual(3, results.Count);
        Assert.AreEqual(2, results.Where(r => r.fruit != null).Count());
        Assert.AreEqual(1, results.Where(r =>  r.attribute != null).Count());

很抱歉水果实施,我已经写好了,我只需要做正确的查询。