1

我有一个首先使用实体​​框架代码的 Web 应用程序,我希望能够将下面的示例数据连接到 ASP.NET 中的各种实体数据感知控件。

通过使用控件的 ItemType 属性来指定我的自定义封装类和控件的 SelectMethod 属性来调用 LINQ 查询,我需要返回一个 IQueryable 集合,控件可以使用该集合并使用自动分页等。

让我们假设我们有一个实体开始:-

public class MyEntity
{
    [Key]
    public int MyObjectId { get; set; }
    public string Name { get; set;}
}

所以这个 LINQ 查询可以正常工作

public IQueryable<MyObject> GetMyObjects()
{
    SiteContext db = new SiteContext();

     var myObjects = (from m in db.MyObjects
                        select m);

    return myObjects;
}

现在使用以下示例数据:-

MyObjectId  Name
1   Apple
2   Orange
3   Apple
4   Apple
5   Pear
6   Orange
7   Apple
8   Grapes
9   Apple
10  Orange

我想要做的是将数据分组并提供如下计数:-

Name    Count
Apple   5
Orange  3
Pear    1
Grapes  1

所以我的第一步是创建一个类来封装实体并提供额外的计数列:-

public class MyObjectWithCount
{
    public MyObject MyObject { get; set; }
    public int Count { get; set; }
}

现在我想通过 LINQ 查询获得一些结果

public IQueryable<MyObjectWithCount> GetMyObjectsWithCount()
{
    SiteContext db = new SiteContext();

     var myObjects = (from m in db.MyObjects
                      group m by m.Name into grouped
                      select new MyObjectWithCount()
                      {
                          MyObject = grouped,
                          Count = ?what goes here?
                      });

    return myObjects;
}

所以我的 select new MyObjectWithCount() 有两个问题

1)如何获得每个分组项目的计数

2) 如何将分组转换为 Myobject。就目前而言,我得到无法将类型 system.linq.grouping 隐式转换为 MyObject 的设计时错误。

如果我没有在 LINQ 查询中执行分组,那么我能够成功地将 IQueryable 返回给我的控件,并且一切都很好(但显然在这个阶段缺少计数)

还要澄清一下,这是我的实体/类的一个过于简单的示例,我确实需要访问完整的 MyObject 实体,因为在现实世界中会有很多字段,而不仅仅是上面示例中的名称字段。

感谢大家提供的任何帮助

4

2 回答 2

0

您可以使用此 linq 查询:

var myObjects = (from m in db.MyObjects
                      group m by m.Name into grouped
                      select new MyObjectWithCount()
                      {
                          MyObject = grouped.FirstOrDefault(),
                          Count = grouped.Count()
                      });

在这种情况下,您的 MyObjectProperty 将具有 MyObjectId 和组中第一个元素的其他属性。

如果所有具有相同名称的对象的 MyObjectId 属性相同,则应按除 MyObjectId 之外的所有属性进行分组:

var myObjects = (from m in db.MyObjects
                          group m by new {m.Name, m.AnyOtherProperty, ...} into grouped
                          select new MyObjectWithCount()
                          {
                              MyObject = grouped.FirstOrDefault(),
                              Count = grouped.Count()
                          });

它将保护您免于在一个对象中折叠一组不同的对象。

于 2013-05-30T16:16:09.043 回答
0

Select的有点不对劲。

此外,由于您的返回类型是IQueryable<MyObjectWithCount>add AsQueryable

编辑:根据您的评论,您也想退回班级中的物品,在这种情况下,您必须执行以下操作:

添加另一个属性来MyObjectWithCount保存匹配的属性和一个包含搜索名称的字符串:

public string Name { get; set; }
public List<MyObject> MatchingObjects { get; set; }

然后你Count可以解决这个问题:

public int Count
{
    get
    {
        return MatchingObjects.Count;
    }
}

那么你的 LINQ 将是:

var myObjects = (from m in db.MyObjects
                  group m by m.Name into grouped
                  select new MyObjectWithCount
                  {
                      Name = grouped.Key,
                      MatchingObjects = grouped.ToList()
                  }).AsQueryable();
于 2013-05-30T15:25:16.480 回答