如何在Queryable.Join中针对内部表使用WHERE子句?
解决Queryable.Join中过滤内部表的问题
要在Queryable.Join中对内部表(示例中的pets)添加过滤条件,不需要调换表的顺序,有两种实用的实现方式:
方法1:连接前先过滤内部表(推荐)
直接在传入Join方法的内部表参数中添加过滤逻辑,先筛选出符合条件的宠物,再和用户表关联,这种方式能减少参与连接的数据量,性能更优:
Console.WriteLine("querywithwhere"); // 筛选重量小于12磅的宠物后,再执行Join var querywithwhere = people.AsQueryable() .Join( pets.Where(pet => pet.WeightInLbs < 12), // 提前过滤内部表pets person => person, pet => pet.Owner, (person, pet) => new { OwnerName = person.Name, Pet = pet.Name, Weight = pet.WeightInLbs } ); foreach (var obj in querywithwhere) { Console.WriteLine( "Owner {0} - Pet {1} - Pet weight {2} ", obj.OwnerName, obj.Pet, obj.Weight.ToString()); }
执行后输出结果:
Owner Adams, Terry - Pet Barley - Pet weight 10
Owner Adams, Terry - Pet Boots - Pet weight 11
方法2:连接后过滤结果集
如果业务需要先完成所有关联再筛选,可以在Join的结果集后追加Where条件:
var querywithwhere = people.AsQueryable() .Join( pets, person => person, pet => pet.Owner, (person, pet) => new { OwnerName = person.Name, Pet = pet.Name, Weight = pet.WeightInLbs } ) .Where(result => result.Weight < 12); // 对Join结果过滤重量条件
这种方式会先生成所有用户-宠物的关联记录,再筛选出符合重量要求的条目,数据量较大时性能不如第一种方法。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

