首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何简化这个LINQ-To-Entity查询,并使其成为动态查询

如何简化这个LINQ-To-Entity查询,并使其成为动态查询
EN

Stack Overflow用户
提问于 2010-12-04 16:32:58
回答 1查看 393关注 0票数 1

我有一个通过Entity Framework获取数据的查询,它现在有效。问题是,我想动态创建查询,即在块中构建它,但我不知道如何准确地执行它。我相信,如果我能以某种方式保存我在开始时检索到的一个值,我就可以做到,但现在我检索了两次(可能也有点慢?除非编译器在查询之前修复了它)。合乎道理?下面是LINQ:

代码语言:javascript
复制
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()
}
);

所以你看,为了得到出发,我必须再次检索同样的东西。所以我想问的是,我可以在第一个查询中保存对象,然后以某种方式检索它吗?我不能让语法正常工作。

数据库看起来像这样:

代码语言:javascript
复制
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)。

此外,我希望能够动态构建此查询,如下所示:

代码语言:javascript
复制
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();

即基于各种变量是否有值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-04 20:27:02

您可以使用let语句来存储局部变量,并在以后重用它们

如下所示:

代码语言:javascript
复制
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()
}
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4352669

复制
相关文章

相似问题

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