Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 林克奇异性_Linq_Distinct - Fatal编程技术网

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.

我收到来自此linq查询的重复行:

             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的工作原理。一点也不“奇怪”。