我应该如何编写Linq to Entity查询?

时间:2009-09-13 07:17:17

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

我是Linq to Entity的新手,所以我不知道我所做的是最好的方法。

当我执行这样的查询时,它会编译,但会抛出一个错误,它无法识别方法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();
}

我如何将其组合成单个查询,因为我无法调用自定义方法?

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

2 个答案:

答案 0 :(得分:2)

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

    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是公开的,以便查询可见。

如果它只是一个Dto,你可以使用anon类型,例如:

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

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

答案 1 :(得分:0)

尝试将GetItemSummaries方法作为Category

的扩展方法
private static IEnumerable<ItemSummary> GetItemSummaries(this Category c)

然后用

调用它
select new Category
            {
                Id = c.Id,
                Name =  c.Name,
                Items = c.GetItemSummaries()
            }).ToList();

马克