2017-02-15 131 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();