这段代码让我烦透了
我创建了一个单独的对象EventDistance,但我认为它可能不是必需的,只是我不确定如何以不同的方式编写它。Distance是我为Event添加到分部类的一个属性。基本上我想返回所有事件,并按距离排序。
我在想,额外的一轮“森林之旅”也许是不必要的。
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);
} 发布于 2011-01-18 03:17:59
据我所知,您不应该需要EventDistance类。只需省略它,并通过在LINQ表达式中不指定任何类型来使用匿名类型:
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);
} 发布于 2011-01-18 03:23:57
我对LINQ语法一无所知,但它确实应该可以在第一个select中填充距离值。就像这样
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; });?或者,写得正确:-)
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对象时,这才是可能的。也就是说,您可能仍然可以
发布于 2011-01-18 03:29:23
如果您想将其保留为IQueryable,您可以这样做:
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。如下所示:
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类。
https://stackoverflow.com/questions/4716865
复制相似问题