Linq 林克奇异性
我收到来自此linq查询的重复行:Linq 林克奇异性,linq,distinct,Linq,Distinct,我收到来自此linq查询的重复行: public static Func<DataContext, string, IQueryable<Building>> GearFilteredBuildings = CompiledQuery.Compile((DataContext db, string filter) => from b in db.
public static Func<DataContext, string, IQueryable<Building>>
GearFilteredBuildings =
CompiledQuery.Compile((DataContext db, string filter) =>
from b in db.Building
join r in db.Router on b equals r.Building
orderby !b.Active
where filter.Length == 5 && r.Name.Substring(1, 5).ToLower() == filter
|| filter.Substring(0, 3) == r.Name.Substring(3, 3).ToLower()
select b);
公共静态函数
齿轮过滤器建筑=
CompiledQuery.Compile((DataContext数据库,字符串筛选器)=>
从数据库大楼b开始
将r加入b上的db路由器等于r大楼
orderby!b.Active
其中filter.Length==5&&r.Name.Substring(1,5).ToLower()==filter
||filter.Substring(0,3)==r.Name.Substring(3,3).ToLower()
选择b);
经过一番摆弄,我得到了这座与众不同的建筑:
public static Func<DataContext, string, IQueryable<Building>>
GearFilteredBuildings =
CompiledQuery.Compile((DataContext db, string filter) =>
(from b in db.Building
join r in db.Router on b equals r.Building
orderby !b.Active
where filter.Length == 5 && r.Name.Substring(1, 5).ToLower() == filter
|| filter.Substring(0, 3) == r.Name.Substring(3, 3).ToLower()
group b by b.Id into g
select g) as IQueryable<Building>);
公共静态函数
齿轮过滤器建筑=
CompiledQuery.Compile((DataContext数据库,字符串筛选器)=>
(从db大楼b开始)
将r加入b上的db路由器等于r大楼
orderby!b.Active
其中filter.Length==5&&r.Name.Substring(1,5).ToLower()==filter
||filter.Substring(0,3)==r.Name.Substring(3,3).ToLower()
b组按b.Id分为g组
选择g)作为IQueryable);
这是一个可以接受的解决方案吗?否则怎么做?不确定(无法在IDE中测试),但选择…加入…拉拉
可以替换为Linq链语法:
db.Routers
.Where(r => filter.Length == 5 && r.Name.Substring(1, 5).ToLower() == filter || filter.Substring(0, 3) == r.Name.Substring(3, 3).ToLower())
.GroupBy(r => r.Building)
.Select(g => g.Key)
.OrderBy(b => !b.Active)
另外:正如我所看到的,在您的查询中不需要任何join
s,因为您的模型中有导航属性(r.Building
)
或者可以使用另一种方法,选择所有需要的建筑,然后使用.Distinct()
:
db.Routers
.Where (r => filter.Length == 5 && r.Name.Substring(1, 5).ToLower() == filter || filter.Substring(0, 3) == r.Name.Substring(3, 3).ToLower())
.Select(r => r.Building)
.Distinct()
.OrderBy(b => !b.Active)
第一个建议奏效了。第二个建议不起作用,因为Distinct()方法对结果集没有影响。我试过(linq语句).Distinct()也没用。我还重写了Building的GetHashCodeMethod(),但没有效果。非常感谢您的回答。这里是linq:from r in db.Router where filter.Length==5&&r.Name.Substring(1,5).ToLower()==filter | | filter.Substring(0,3)==r.Name.Substring(3,3).ToLower()按r分组。构建到grp select grp.KEY如果加入,则在出现多个子行时将看到父行的重复。这就是join的工作原理。一点也不“奇怪”。