Невозможно преобразовать лямбда-выражение в тип 'string', поскольку оно не является делегатом - PullRequest
8 голосов
/ 31 марта 2011

Я создаю страницу, которая отображает результат запроса LINQ в виде таблицы.

  1. Установите базовый запрос в методе «SetupArticleQuery ()», который сохраняет запрос в «this.articles».
  2. Запустите другой метод, UpdateFilter (), чтобы выполнить некоторую фильтрацию результатов, сохраненных в this.articles.

Я получаю сообщение об ошибке

Невозможно преобразовать лямбда-выражение в тип '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;

            }
        }
}

Ответы [ 4 ]

28 голосов
/ 28 января 2012

Мне пришлось добавить следующее, чтобы убрать эту ошибку.

using System.Data;
using System.Data.Entity;
13 голосов
/ 31 марта 2011

На самом деле я не нашел никаких проблем в вашем коде.

Из этого ответа я бы предложил подтвердить, что вы добавили:

Using System.Linq;

Удачи!

5 голосов
/ 31 марта 2011

Этот запрос:

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>.

1 голос
/ 31 марта 2011

Если это проблема с анонимными типами, можете ли вы сделать что-то подобное?

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

Это может быть неосновно, так как базовая лямбда одинакова.

...