实体框架查询从其他实体中选择前2名

时间:2015-01-09 13:54:35

标签: asp.net-mvc entity-framework

我是Entity Framework的新手。我想通过ASP.NET MVC项目中的Entity Framework环境归档此查询。

这是我的查询应该执行的内容:

SELECT * FROM Documents
WHERE CREATEDATE IN(
    SELECT DISTINCT TOP 2 FORMONTH
    FROM DocHistory 
    WHERE FORMONTH < GETDATE()
    ORDER BY FORMONTH DESC
)

我如何在Entity Framework中执行此操作?

var result = from d in Documents
             where d.CREATEDATE ???

致以最诚挚的问候,

Veasna

4 个答案:

答案 0 :(得分:1)

好的,所以将其分解为两部分。

SELECT DISTINCT TOP 2 FORMONTH
FROM DocHistory 
WHERE FORMONTH < GETDATE()
ORDER BY FORMONTH DESC

这变为

DocHistory.Where(dh => dh.FORMONTH < DateTime.Now)
          .OrderByDescending(dh => dh.FORMONTH)
          .Take(2);

所以我们现在有两个月了

Documents.Where(doc=> DocHistory.Where(dh => dh.FORMONTH < DateTime.Now)
                                .OrderByDescending(dh => dh.FORMONTH)
                                .Take(2)
                                .Select(q => q.FORMONTH)
                                .Contains(doc.CREATEDATE.Month))

答案 1 :(得分:0)

我会保持简单。首先获取2个日期,然后获取所需的文档。像这样:

var dates = DocHistory.Where(dh => dh.FORMONTH < DateTime.Now).OrderByDescending(FORMONTH).Take(2);
var results = Documents.Where(d => dates.Contains(dates));

答案 2 :(得分:0)

首先,让我们描述内部查询:

DocHistory.Select(dh => dh.FORMONTH)
          .Where(dt => dt < DateTime.Now)
          .Distinct()
          .OrderByDescending()
          .Take(2)

然后完整查询将是:

Documents.Where(d => DocHistory.Select(dh => dt.FORMONTH)
                               .Where(dt => dt < DateTime.Now)
                               .Distinct()
                               .OrderByDescending()
                               .Take(2)
                               .Contains(d.CREATED));

答案 3 :(得分:0)

您可以执行以下操作

var date = DateTime.Now;

from d in db.Documents
where ( from t in db.DocHistory
        where FORMMONTH < date
        select FORMMONTH).OrderByDescending()
                         .Distinct()
                         .Take(2).Contains(d.CREATEDATE)
select d;

希望这会对你有所帮助