.net linq查询加入

时间:2017-02-15 20:50:02

标签: c# linq many-to-many

我和我的"在哪里" linq查询中的子句。 我有以下三个表。

项{ItemId,Name}

Buckets {BucketId,Name}

ItemsBuckets {Id,BucketId,ItemId}

项目可以存在于多个存储桶中,这就是我拥有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?)    

我无法找到解决这个问题的方法。有任何想法吗?

3 个答案:

答案 0 :(得分:3)

您是否尝试过以下操作?

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

var items = query.ToList();

答案 1 :(得分:0)

您需要通过第一次查询并调用.ToList()来枚举结果,然后在该结果集上使用Where()子句。

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

答案 2 :(得分:0)

假设您在Buckets of ICollection<ItemBucket>上有一个属性Item

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

return query.ToList();