2012-11-12 101 views
1

多列实体框架导致我有如下表:如何筛选使用lambda表达式

enter image description here

,后面的数据:

enter image description here

我怎样才能筛选结果,以便我只从每个omraade_id(按排序降序)获取最新一行?

在这种情况下将与ID行:10101005

-

从@ lazyberezovsky的回答,我已经创建了下面的表达式:

dbConnection = new ElecEntities(); 

      var query = from data in dbConnection.Valgdata 
      orderby data.timestamp descending 
      group data by data.omraade_id into g 
      select g.FirstOrDefault(); 

      return query.ToList(); 

它返回两个ID为3和4的行是数据库中的前两行,也是具有最低时间戳的行。任何想法为什么?

回答

1

我没有EF的经验,所以我不确定是否只有SQL-esque的linq在这里工作。一个普通的C#-ish:

var query = dbConnection.Valgdata.GroupBy(u => u.omraade_id) 
     .Select(x => x.FirstOrDefault(y => x.Max(p => p.timestamp) == y.timestamp)); 
+0

This Works! Coool:D – Kenci

+0

@Kenci为什么是FirstOrDefault? “First”适用于所有情况!因为无论如何你总会有最大时间戳。 – nawfal

+0

时间戳列可以为空,并且当我用First()执行查询时它会抛出一个错误 - 但我应该改变这个:) – Kenci

0
var query = from v in dbConnection.Valgdata 
      orderby v.timestamp descending 
      group v by v.omraade_id into g 
      select g.First(); 

这将只返回每个omraade_id具有最大时间戳的记录。

更新上面的查询对我很好(至少对于MS SQL Linq提供者)。你也不需要做FirstOrDefault - 如果omraade_id被分组,那么它肯定至少有一行。

var query = from v in dbConnection.Valgdata 
      group v by v.omraade_id into g 
      select g.OrderByDesc(x => x.timestamp).First(); 
+0

您能否检查我更新的问题?谢谢 – Kenci

+0

它返回相同的,如果我写降序或升序 – Kenci

+0

@Kenci查看更新的答案。也许它的linq提供程序的具体问题。尝试在分组后排序记录。这绝对应该工作。 –

0

您已将滤镜放在每个项目上。它应该应用于完整的查询结果,而不是每个项目。

以下为更新后的查询。

var query = (from data in dbConnection.Valgdata 
     orderby data.timestamp descending 
     group data by data.omraade_id into g 
     select g).FirstOrDefault(); 
+0

感谢您的回答。我已经尝试了你的建议,它返回了9个结果(所有id = 6的行) – Kenci

2
var query = dbConnection.Valgdata 
         .GroupBy(x => x.omraade_id) 
         .Select(g => g 
          .OrderByDescending(x => x.timestamp) 
          .FirstOrDefault()); 
+0

感谢您的尝试。这将返回所有11行(返回行= 3 9次,行= 4 2次)? – Kenci

+0

@Kenci更新了我的答案。 –

+0

再次感谢。我很欣赏这种努力。这将返回带有两个键的分组对象。第一个键包含第一个omraade_id的所有行,第二个键包含第二个omraade_id的所有行(未排序)。 – Kenci

0

这是我的解决方案迄今:

var data = dbConnection.Valgdata.Where(x => x.godkendt == false).ToList(); 
var dataGrouped = data.GroupBy(x => x.omraade_id).ToList(); 

List<Valgdata> list = new List<Valgdata>(); 

foreach (var grpdata in dataGrouped) 
      { 
       var dataGroup = grpdata.OrderByDescending(x => x.timestamp).ToList(); 
       list.Add(dataGroup.FirstOrDefault()); 
      } 
return list; 

我不知道这是否是最有效的,但它的作品。