无法将 lambda 表达式转换为类型 'string',因为它不是委托类型。

8
我正在构建一个页面,将LINQ查询结果显示为表格。
  1. 在“SetupArticleQuery()”方法中设置基本查询,将查询保存到“this.articles”中。
  2. 运行另一个名为“UpdateFilter()”的方法,在保存在“this.articles”中的结果上进行一些过滤。
我遇到了以下错误:

无法将Lambda表达式转换为类型“string”,因为它不是委托类型。

代码行如下:
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;。 - markmnl
4个回答

28

为了消除这个错误,我不得不添加以下内容。

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

太棒了 - 这正是解决方案。谢谢! - Doug

13

实际上我在你的代码中没有找到任何问题。

根据这个回答,我建议您确认是否已经添加:

Using System.Linq;

祝你好运!


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

当然,这些文章将被声明为。

1

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

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

这可能有些偏离主题,因为底层的 lambda 表达式是相同的。


我也尝试了那个,但是我收到了相同的错误信息。 - Damiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接