首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不确定这段代码,有代码的味道!

不确定这段代码,有代码的味道!
EN

Stack Overflow用户
提问于 2011-01-18 03:11:35
回答 4查看 211关注 0票数 2

这段代码让我烦透了

我创建了一个单独的对象EventDistance,但我认为它可能不是必需的,只是我不确定如何以不同的方式编写它。Distance是我为Event添加到分部类的一个属性。基本上我想返回所有事件,并按距离排序。

我在想,额外的一轮“森林之旅”也许是不必要的。

代码语言:javascript
复制
public IQueryable<Event> FindByLocation(float latitude, float longitude)
        {

            var eventsList = from ev in GetAllEvents()
                             join i in db.NearestEvents(latitude, longitude)
                             on ev.ID equals i.ID
                             select new EventDistance() { TheEvent = ev, Distance = i.Distance };


            foreach (var item in eventsList)
            {
                item.TheEvent.Distance = item.Distance;  
            }
            return eventsList.OrderBy(e => e.Distance).Select(e => e.TheEvent);
        } 
EN

回答 4

Stack Overflow用户

发布于 2011-01-18 03:17:59

据我所知,您不应该需要EventDistance类。只需省略它,并通过在LINQ表达式中不指定任何类型来使用匿名类型:

代码语言:javascript
复制
public IQueryable<Event> FindByLocation(float latitude, float longitude)
    {

        var eventsList = from ev in GetAllEvents()
                         join i in db.NearestEvents(latitude, longitude)
                         on ev.ID equals i.ID
                         select new { TheEvent = ev, Distance = i.Distance };


        foreach (var item in eventsList)
        {
            item.TheEvent.Distance = item.Distance;  
        }
        return eventsList.OrderBy(e => e.Distance).Select(e => e.TheEvent);
    } 
票数 1
EN

Stack Overflow用户

发布于 2011-01-18 03:23:57

我对LINQ语法一无所知,但它确实应该可以在第一个select中填充距离值。就像这样

代码语言:javascript
复制
var eventsList = from ev in GetAllEvents()
                 join i in db.NearestEvents(latitude, longitude)
                 on ev.ID equals i.ID
                 orderby i.Distance
                 select (ev => { ev.Distance = i.Distance; return ev; });

?或者,写得正确:-)

代码语言:javascript
复制
var eventsList = GetAllEvents()
                 .Join(db.NearestEvents(latitude, longitude),
                       ev => ev.ID,
                       i => i.ID,
                       (ev, i) => { ev.Distance = i.Distance; return ev; })
                 .OrderBy(ev => ev.Distance);

注意,正如下面的qstarin注释所示,只有当我们在这一点上操作对象,而不是计算为SQL的ORM对象时,这才是可能的。也就是说,您可能仍然可以

  1. 在初始fetch
  2. 中执行排序操作强制对象进入内存(我忘记了执行此操作的最佳方法)
  3. 使用单个select将对象组合到上述事件对象中,而不是循环
票数 1
EN

Stack Overflow用户

发布于 2011-01-18 03:29:23

如果您想将其保留为IQueryable,您可以这样做:

代码语言:javascript
复制
        public IQueryable<Event> FindByLocation(float latitude, float longitude)
        {

            return from ev in GetAllEvents()
                   join i in db.NearestEvents(latitude, longitude)
                   on ev.ID equals i.ID
                   order by i.Distance
                   select ev;
        }

只要GetAllEvents()方法也返回IQueryable,就是这样。

编辑:我现在实际上已经尝试了下面Rup的建议,您应该能够在不调用此方法中的db调用的情况下返回一个IQueryable。如下所示:

代码语言:javascript
复制
        public IQueryable<EventDistance> FindByLocation(float latitude, float longitude)
        {
                return from ev in GetAllEvents()
                   join i in db.NearestEvents(latitude, longitude)
                   on ev.ID equals i.ID
                   orderby i.Distance
                   select new EventDistance
                   {
                       Event = ev,
                       Distance = i.Distance
                   };
       }

不需要映射EventDistance类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4716865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档