2011-03-31 249 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

相关问题