0

我有一个表时间戳和一个 pable 项目。

我需要所有项目,其中列“Finished == false”和最后生成的时间戳。

我当前的代码:

 var result = from p in _contextProvider.Context.Projects
                     join t in _contextProvider.Context.Timestamps on p.Guid equals t.GuidProject
                     where p.Finished == false
                     orderby t.End
                     select new { p.Name, t.End };

如何按项目创建“max(t.Enc) 组”?PS:抱歉我的标题不好,但我不知道我使用哪种语法:(

4

2 回答 2

0

好的,这是一个棘手的问题。以下是您在 SQL 中的操作方法,并且相对容易:

SELECT *
FROM Projects p
JOIN Timestamps t ON p.Guid = t.GuidProject
WHERE p.Finshed = FALSE AND
 t.END = (
    SELECT max(t1.END)
    FROM Projects p1
    JOIN Timestamps t1 ON p1.Guid = t1.GuidProject
    WHERE p.Finshed = FALSE AND p.Guid = p1.Guid
 )

将其转换为 Linq 会比较棘手。这是我尝试过的,但我无法测试它。

        var baseQuery = _contextProvider.Context.Projects
                .Join(_contextProvider.Context.Timestamps, p => p.Guid, t => t.GuidProject, (p, t) => new {p, t})
                .Where(o => o.p.Finished == false);

        var result = baseQuery.Select
            .Where(o => o.t.End == baseQuery
                            .Where(o2 => o2.p == o.p)
                            .Select(o2 => o2.t.End)
                            .Max()
                   ).Select( o => new {o.p.Name, o.t.End} );

可能是我把它复杂了一点,它可以用 来实现group by,试试这样的:

        var result = (from p in _contextProvider.Context.Projects
                      join t in _contextProvider.Context.Timestamps on p.Guid equals t.GuidProject
                      where p.Finished == false
                      group t.End by p.Name into g
                      select new { name=g.Key, end=g.Max()} );
于 2013-02-20T08:54:01.693 回答
0

对于一个快速而肮脏的解决方案,您可以尝试按 t.End 降序排序,然后只取顶部的 1/first-or-default 结果。

于 2013-02-20T08:55:34.893 回答