C# 我应该如何编写这个Linq到实体查询?

C# 我应该如何编写这个Linq到实体查询?,c#,asp.net-mvc,linq-to-entities,C#,Asp.net Mvc,Linq To Entities,我对Linq是个新手,所以我不知道我所做的是不是最好的方法 当我执行这样的查询时,它会编译,但会抛出一个错误,即它无法识别GetItemSummaries方法。查找它,这似乎是因为它不喜欢查询中的自定义方法 return (from c in _entity.Category from i in c.Items orderby c.Id, i.Id descending select new Cate

我对Linq是个新手,所以我不知道我所做的是不是最好的方法

当我执行这样的查询时,它会编译,但会抛出一个错误,即它无法识别GetItemSummaries方法。查找它,这似乎是因为它不喜欢查询中的自定义方法

return (from c in _entity.Category
                from i in c.Items
                orderby c.Id, i.Id descending
                select new CategoryDto
                {
                    Id = c.Id,
                    Name =  c.Name,
                    Items = GetItemSummaries(c)
                }).ToList();

private IEnumerable<ItemSummary> GetItemSummaries(CategoryDto c)
{
    return (from i in c.Items
            select new ItemSummary
             {
               // Assignment stuff
             }).ToList();
}
return(来自实体类别中的c
从i到c.项目
按c.Id、i.Id降序排序
选择“新建类别到”
{
Id=c.Id,
Name=c.Name,
Items=GetItemSummaries(c)
}).ToList();
私有IEnumerable GetItemSummaries(c类)
{
返回(来自i/c.项目
选择新项目摘要
{
//任务材料
}).ToList();
}
既然我不能调用自定义方法,我该如何将其组合到单个查询中


我尝试用实际的查询替换方法调用,但结果是ItemSummary无法识别,而不是方法名无法识别。有没有办法做到这一点?(或者更好的方法?

尝试将
GetItemSummaries
方法作为
类别
类的扩展方法

private static IEnumerable<ItemSummary> GetItemSummaries(this Category c)

Marc

您应该能够执行以下操作:

    return (
            from c in _entity.Category
            orderby c.Id descending
            select new CategoryDto
            {
                Id = c.Id,
                Name =  c.Name,
                Items = (
                    from i in c.Items
                    order by i.Id descending
                    select new ItemSummary
                    {
                        // Assignment stuff
                    }
                )
            }).ToList();
这只是确保ItemSummary是公共的,以便查询可以看到它

return (from c in _entity.Category
                from i in c.Items
                orderby c.Id, i.Id descending
                select new CategoryDto
                {
                    Id = c.Id,
                    Name =  c.Name,
                    Items = GetItemSummaries(c)
                }).ToList();

private IEnumerable<ItemSummary> GetItemSummaries(CategoryDto c)
{
    return (from i in c.Items
            select new ItemSummary
             {
               // Assignment stuff
             }).ToList();
}
如果只是Dto,您可以使用anon类型,例如:

                    from i in c.Items
                    order by i.Id descending
                    select new
                    {
                        Id = i.Id,
                        Name = i.Name
                    }

这将创建一个具有“Id”和“Name”属性的类型。这一切都取决于您的消费代码需要什么:)

对不起,这只是一个学习应用程序,所以我的命名有点懒惰。我返回的类别是从实体对象创建的Dto对象,我认为我不能在Dto类上创建一个扩展方法并让它执行我想要的操作。为什么不呢?您可以在任何对象上放置扩展方法—只要“Category”对象包含GetItemSummaries方法中所需的所有信息—没有问题。