【问题标题】:LINQ to Entities Group By and then select the min valueLINQ to Entities Group By 然后选择最小值
【发布时间】:2013-08-11 15:51:48
【问题描述】:

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

我的保险单都有唯一的保单编号。但对于一项保单,客户可能需要在多个日期付款。因此,根据我表中的上述信息,我说四行具有不同的 ID,但每条记录具有相同的保单编号和不同的日期。

我使用 MDI Windows 窗体,我有一个显示所有客户端信息的窗体,问题就来了。如果一个保单有多个日期,或者换句话说,我的表中有多个记录,我只想显示即将到来的日期的记录,并且只有当用户单击“详细信息”以显示该保单的所有日期时。

因此,我需要按 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&lt;MainInfo&gt;();

错误是:

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

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

【问题讨论】:

  • 我认为这个问题不应该如此冗长。只需发布您想要的内容和您尝试过的一段代码。
  • 如果你没有指定类型&lt;MainInfo&gt;,只是ToList(),你会成功运行它,但是那是&lt;IGrouping&lt;string,MainInfo&gt;&gt;的列表,这可能不是你真正想要的。
  • 嗯,我一直在暗地里希望有人能提供一些关于如何使用 VS2012 和 SQL CE 设计数据库的教程的好地方。我有几个项目,但一直使用 MS SQL 2008 + ADO.NET EF 和 Code First,现在我发现我缺乏很多基础知识。

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


【解决方案1】:

您的查询:

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

返回IQueryable&lt;IGrouping&lt;string, MainInfo&gt;&gt;,所以你不能在上面调用ToList&lt;MainInfo&gt;

根据您的要求:

所以我需要的是通过 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&lt;MainInfo&gt;,所以你应该可以在上面调用ToList&lt;MainInfo&gt;

【讨论】:

  • 它完全符合我的需要。只是 - 要获取最近的日期,它应该是 test.OrderBy(cs =&gt; cs.Date)OrderByDescending 我得到最新的日期。谢谢。
【解决方案2】:

试试类似的东西

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};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多