LINQ to Entities Group By然后选择min值

时间:2013-08-11 15:51:48

标签: c# .net linq linq-to-entities

我正在使用VS2012和SQL Compact Edition,我很难创建数据库。我正在尝试使用VS2012中的设计器,但我仍然不能做简单的事情,如定义外键和类似的东西,但我需要快速准备一个Demo,所以我决定将学习留待以后,现在我在我的数据库中只使用一个表(这是一个小项目),我的行数不到500行,所以这不是一个大问题。但是我需要这样做:

我有保单,每个人都有唯一的保单号。但是对于一个政策,客户需要付款时可能会有几个日期。因此,根据我上表中的信息,我说有四行具有不同的ID但具有相同的策略编号和每个记录的不同日期。

我使用MDI Windows Forms,我有一个表单,我显示所有客户的信息,这就是问题所在。如果一个策略有多个日期,或者换言之,我的表中有几个记录,我想只显示即将到来的日期的记录,并且只有当用户点击“详细信息”以显示此保险单的所有日期时。

所以我需要的是通过PolicyNumber查询表组结果,并查看具有多个日期的每个策略以获取最近日期的记录。

现在我有了这个:

 using (RalBaseEntities ctx = new RalBaseEntities())
            {
                var mainGridInfo = from cs in ctx.MainInfo
                                   where cs.Id != null
                                   select cs;

                IList<MainInfo> mainGridInfoList = mainGridInfo.ToList<MainInfo>();
                dgvClients.DataSource = mainGridInfoList;
            }

因此,我试着像这样使用group by

var mainGridInfo = from cs in ctx.MainInfo
                                   where cs.Id != null
                                   group cs by cs.PolicyNumber into test
                                   select test;

但后来我把它标记为错误:IList mainGridInfoList = mainGridInfo.ToList<MainInfo>();

错误是:

Error   1   'System.Linq.IQueryable<System.Linq.IGrouping<string,SHAdmin.MainInfo>>' does not contain a definition for 'ToList' and the best extension method overload 'System.Linq.ParallelEnumerable.ToList<TSource>(System.Linq.ParallelQuery<TSource>)' has some invalid arguments  C:\Users\X-Man\Desktop\SHAdmin\SHAdmin\Forms\Clients.cs 44  52  SHAdmin

即使这个工作者我仍然不知道如何仅提取最近日期的记录。

2 个答案:

答案 0 :(得分:4)

您的查询:

var mainGridInfo = from cs in ctx.MainInfo
                   where cs.Id != null
                   group cs by cs.PolicyNumber into test
                   select test;

返回IQueryable<IGrouping<string, MainInfo>>,因此您无法在其上调用ToList<MainInfo>

根据您的要求:

  

所以我需要的是通过PolicyNumber查询表组的结果   并且对于每个有几个日期的政策都要记录   最近的约会。

我认为您正在寻找:

var mainGridInfo = from cs in ctx.MainInfo
                   where cs.Id != null
                   group cs by cs.PolicyNumber into test
                   select test.OrderByDescending(cs => cs.Date).First();

它将返回IQueryable<MainInfo>,因此您应该可以在其上调用ToList<MainInfo>

答案 1 :(得分:0)

尝试类似

的内容
var mainGridInfo = from cs in ctx.MainInfo
                                   where cs.Id != null
                                   group cs by cs.PolicyNumber into test
                                   select new { Key = test.Key, MainInfo = test};