2009-09-13 74 views
0

我是Linq to Entity的新手,所以我不知道我在做什么是最好的方法。我应该如何将此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(); 
} 

由于我无法调用自定义方法,我该如何将它组合成单个查询?

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

回答

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不过,你可以使用一个匿名类型,例如:

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

这将创建与“ID”和“名称”的属性类型。这一切都取决于你的消费代码需要:)

0

尝试使GetItemSummaries方法上Category类的扩展方法

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

,然后用

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

称之为马克

+0

对不起,这只是一个学习应用程序,所以我的namings是一种懒惰。我返回的类别是一个从实体对象创建的Dto对象,我不认为我可以在Dto类上创建扩展方法并让它按照我的需要进行操作。 – Brandon 2009-09-13 07:36:17

+0

为什么不呢?你可以在任何对象上放置扩展方法 - 只要你的“Category”对象包含你在GetItemSummaries方法中需要的所有信息 - 没问题。 – 2009-09-13 12:51:19