【问题标题】:Cannot convert lambda expression to type 'string' because it is not a delegate type无法将 lambda 表达式转换为类型“字符串”,因为它不是委托类型
【发布时间】:2011-03-31 14:42:54
【问题描述】:

我正在构建一个将 LINQ 查询结果显示为表格的页面。

  1. 在“SetupArticleQuery()”方法中设置基本查询,将查询保存到“this.articles”。
  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;

            }
        }
}

【问题讨论】:

  • 我遇到了同样的问题,因为我只是错过了使用 System.Linq;

标签: c# .net linq lambda extension-methods


【解决方案1】:

我必须添加以下内容才能消除此错误。

using System.Data;
using System.Data.Entity;

【讨论】:

  • 太棒了 - 这是正确的解决方案。谢谢!
【解决方案2】:

其实我没有发现你的代码有什么问题。

从这个answer,我建议确认您已添加:

Using System.Linq;

祝你好运!

【讨论】:

    【解决方案3】:

    这个查询:

    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);
    }
    

    当然 this.articles 会被声明为IQueryable<LocalDTO>

    【讨论】:

      【解决方案4】:

      如果是匿名类型的问题,你可以这样做吗?

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

      这可能是错误的,因为底层的 lambda 是相同的。

      【讨论】:

      • 我也试过了,但我收到了同样的错误信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多