我有一个通过Entity Framework获取数据的查询,它现在有效。问题是,我想动态创建查询,即在块中构建它,但我不知道如何准确地执行它。我相信,如果我能以某种方式保存我在开始时检索到的一个值,我就可以做到,但现在我检索了两次(可能也有点慢?除非编译器在查询之前修复了它)。合乎道理?下面是LINQ:
from d in db.trains
where d.cancelled
&& d.station == toStation
&& d.date >= fromDate.Date
&& d.date <= toDate.Date
&& (from k in db.trains
where
k.date == d.date
&& k.trainId == d.trainId
&& k.stationId == fromStation
&& k.position <= d.position
select k.trainId).Contains(d.trainId)
select new
{
trainId = d.trainId,
date = d.date,
arrival = d.arrival,
departure = (from k in db.trains
where
k.date == d.date
&& k.trainId == d.trainId
&& k.stationId == fromStation
&& k.position <= d.position
select k.departure).FirstOrDefault()
}
);所以你看,为了得到出发,我必须再次检索同样的东西。所以我想问的是,我可以在第一个查询中保存对象,然后以某种方式检索它吗?我不能让语法正常工作。
数据库看起来像这样:
trainId stationId date arrival departure position
1 99 2010-10-11 10:00 10:10 1
1 98 2010-10-11 11:20 11:30 2
1 47 2010-10-11 12:30 12:40 3
2 99 2010-10-10 15:00 15:10 5等
因此,基本上,我需要从db中检索两个对象,其中第一个对象具有stationId x,另一个对象具有stationId y,这两个对象都具有相同的日期和trainId,并且它们必须基于位置以正确的顺序排列(列车是双向的,但具有不同的trainId)。
此外,我希望能够动态构建此查询,如下所示:
var trains = from d in db.trains
select d;
if (id > 0)
trains = trains.Where(p => p.trainId == id);
if (date != DateTime.MinValue)
trains = trains.Where(p => p.date == date);
var items = (from train in trains).ToList();即基于各种变量是否有值。
发布于 2010-12-04 20:27:02
您可以使用let语句来存储局部变量,并在以后重用它们
如下所示:
from d in db.trains
where d.cancelled
&& d.station == toStation
&& d.date >= fromDate.Date
&& d.date <= toDate.Date
let departures = (from k in db.trains
where
k.date == d.date
&& k.trainId == d.trainId
&& k.stationId == fromStation
&& k.position <= d.position
select k)
where departures.Select(d => d.trainId).Contains(d.trainId)
select new
{
trainId = d.trainId,
date = d.date,
arrival = d.arrival,
departure = departures.Select(d => d.departure).FirstOrDefault()
}
);https://stackoverflow.com/questions/4352669
复制相似问题