2009-09-13 77 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