2015-10-14 45 views
0

我的tagNumbers是List<string>類型。我需要使用數據庫在此List上進行左連接。目前,當我開始在數據庫上進行跟蹤時,我發現儘可能多的查詢被觸發,儘管許多記錄都在這個列表中。另外這個LINQ查詢使用LEFT時給出了一個錯誤JOIN即lj.DefaultIfEmpty()因爲l.TagId將NULL在LEFT的情況下,JOIN的一些記錄在dbContext和InMemory之間的LINQ中加入連接列表

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. 我應該如何糾正我的左手從得到一個異常

錯誤 Object reference not set to an instance of an objectjoin m in dbContext.MapTagEntities on l.TagId equals m.TagId l.TagId JOIN,因爲「L」爲空在LEFT的情況下,JOIN,其中連接條件不匹配。

+0

你不能加入內存列表與db表... –

+0

你真的想要一個答案嗎?我敢打賭,沒有人有你的確切模型和數據來測試這個查詢,並自己看到異常。通過瀏覽查詢,它看起來相當不錯,但目前對您的模型沒有了解。 –

+0

@KingKing根據你的評論,我簡化了LINQ查詢。 tagNumbers是我在內存列表中,而另外兩個是數據庫表。我需要獲取所有tagNumbers,而不管我在「SELECT」中的加入。雖然匹配標籤,我也需要相應的數據。 –

回答

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()); 

對不起水果實施,我已經寫了,我只是需要做適當的查詢。