2011-03-31 50 views
8

我構建了一個以LINQ查詢結果爲表格的頁面。無法將lambda表達式轉換爲類型'string',因爲它不是委託類型

  1. 在將'查詢'保存到'this.articles'的'SetupArticleQuery()'方法中設置基本查詢。
  2. 運行另一種方法'UpdateFilter()'對保存在'this.articles'中的結果進行一些過濾。

我得到的錯誤

無法轉換lambda表達式到類型 '串',因爲它不是一個委託類型

在該行的代碼

this.articles = from art in this.articles 
       where art.category_id == this.categoryId 
       select art; 

任何想法如何修復下面的代碼?

namespace WebApplication3 { 
    public partial class _Default : System.Web.UI.Page { 
     private IQueryable articles; 

     protected void Page_Load(object sender, EventArgs e) { 
      this.SetupArticleQuery(); 
      this.UpdateFilter(); 
     } 

     private void SetupArticleQuery() { 
      this.articles = from a in KB.Articles 
          join t in KB.Teams on a.primary_team_id equals t.id 
          join cat in KB.Categories on a.category_id equals cat.id 
          join scat in KB.SubCategories on a.subcategory_id equals scat.id 
          join top in KB.Topics on a.topic_id equals top.id 
          select new { 
           a.id, 
           a.title, 
           a.view_count, 
           a.created_at, 
           a.created_by, 
           a.primary_team_id, 
           primary_team_name = t.name, 
           category_id = cat.id, 
           category_name = cat.name, 
           subcategory_id = scat.id, 
           subcategory_name = scat.name, 
           topic_id = top.id, 
           topic_name = top.name 
          }; 
     } 

     private void UpdateFilter() { 
      if (this.categoryId > 0) { 
       this.articles = from art in this.articles 
           where art.category_id == this.categoryId 
           select art; 

      } 
     } 
} 
+0

我有同樣的問題,因爲我只是想念我使用System.Linq; – markmnl 2012-06-25 04:00:58

回答

5

這個查詢:

this.articles = from a in KB.Articles 
       join t in KB.Teams on a.primary_team_id equals t.id 
       join cat in KB.Categories on a.category_id equals cat.id 
       join scat in KB.SubCategories on a.subcategory_id equals scat.id 
       join top in KB.Topics on a.topic_id equals top.id 
       select new { 
        a.id, 
        a.title, 
        a.view_count, 
        a.created_at, 
        a.created_by, 
        a.primary_team_id, 
        primary_team_name = t.name, 
        category_id = cat.id, 
        category_name = cat.name, 
        subcategory_id = scat.id, 
        subcategory_name = scat.name, 
        topic_id = top.id, 
        topic_name = top.name 
       }; 

不會喜歡這個工作,因爲它返回一個匿名類型。因此,您必須將其輸入爲var,這對於班級成員無效;你只能使用var作爲局部變量。

你需要做的是創建一個實際的類來保存您的投影,並有類似:

... 
join top in KB.Topics on a.topic_id equals top.id 
select new LocalDTO() 
{ 
    id = a.id, 
    ... 
}; 

從那裏你可以只是:

private void UpdateFilter() 
{ 
    if (this.categoryId > 0) 
     this.articles = this.articles.Where(a => art.category_id); 
} 

當然這和。文章將被宣佈爲IQueryable<LocalDTO>

1

如果這是一個匿名類型的問題,你可以做這樣的事情嗎?

private void UpdateFilter() { 
    if (this.categoryId > 0) { 
     this.articles = this.articles.Where(a => a.category_id == this.categoryId).AsQueryable(); 
    } 
} 

由於底層lambda是相同的,所以這可能是偏離基數。

+0

我也試過這個,但我收到了同樣的錯誤信息。 – Damiro 2011-03-31 17:06:36

13

其實我沒有在你的代碼中發現任何問題。

從這個answer,我建議您確認是否已添加:

Using System.Linq; 

祝你好運!

+0

thx,你保存了一天! – 2013-07-02 12:59:29

28

我不得不添加以下內容才能使此錯誤消失。

using System.Data; 
using System.Data.Entity; 
+1

節省了我的時間感謝解決方案 – bhargav 2012-05-01 14:27:58

+0

真棒 - 這是確切的解決方案。謝謝! – Doug 2012-10-05 13:17:27

相關問題