2017-02-15 168 views
2

我在linq查詢中遇到了一些問題。 我有以下三張表。.net linq查詢加入

項目{項目Id,名稱}

桶{BucketId,名稱}

ItemsBuckets {ID,BucketId,項目Id}

項目可以在多個類別中存在的,這就是爲什麼我有ItemsBuckets表。 我想查找具有名稱包含bucketname的特定存儲桶的所有項目。

System.Linq.IQueryable<Item> query = context.Items.Include("ItemsBuckets") 
        .Include("ItemsBuckets.Buckets"); 
query = query.Where(n => n.ItemsBuckets.Buckets.Name.Contains(bucketname)); 
ObservableCollection<Item> items = new ObservableCollection<Item>(query.ToList()); 

我的where子句不起作用。我收到以下錯誤:

Error CS1061 'ICollection<ItemsBuckets>' does not contain a definition for 
'Buckets' and no extension method 'Buckets' accepting a first argument of 
type ICollection<ItemsBuckets> could be found (are you missing a using 
directive or an assembly reference?)  

我找不出辦法解決這個問題。有任何想法嗎?

+0

哪裏'query'從何而來?你爲什麼分配兩次'q'? – tinstaafl

+0

對不起,這是一個錯字。我編輯了代碼以顯示查詢來自何處。在我的實際代碼中,我有幾個query = query.Where語句。 – kurgaan

+0

你看到了什麼錯誤信息,或者有什麼不符合你的期望? – awh112

回答

3

您是否嘗試過以下方法?

var query = context.Items 
        .Where(i => i.ItemsBuckets.Any(ib => ib.Bucket.Name.Contains(bucketname))); 

var items = query.ToList(); 
+0

謝謝。那是票。 – kurgaan

0

您需要先查詢第一個查詢並調用.ToList()來枚舉結果,然後在結果集上使用您的Where()子句。

var q = context.Items.Include("ItemsBuckets").Include("ItemsBuckets.Buckets").ToList(); 
var results = q.Where(n => n.ItemsBuckets.Buckets.Name.Contains(bucketname)); 
+1

這是效率低下,因爲您將ItemsBuckets的整個數據庫返回到代碼。數據庫層的過濾器會更好。 –

0

假設您有Item屬性Buckets of ICollection<ItemBucket>

var query = from item in context.Items 
      where item.Buckets.Any(b => b.BucketName == name) 
      select item; 

return query.ToList();