林奇陌生

时间:2010-12-04 01:09:59

标签: linq distinct

我正在接收来自此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);

经过一番摆弄,我得到了与众不同的建筑物:

        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>); 

这是一个可以接受的解决方案吗?怎么可能这样做?

1 个答案:

答案 0 :(得分:2)

不确定(无法测试IDE),但select...join...lalala可以替换为Linq-Chain语法:

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,因为您的模型中有导航属性(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)