linq help - новичок - PullRequest
       20

linq help - новичок

0 голосов
/ 14 ноября 2008

как получается эта работа

public IQueryable<Category> getCategories(int postId)  
{
      subnusMVCRepository<Categories> categories = new subnusMVCRepository<Categories>();
      subnusMVCRepository<Post_Category_Map> postCategoryMap = new  subnusMVCRepository<Post_Category_Map>();

      var query = from c in categories.GetAll()
                  join pcm in postCategoryMap.GetAll() on c.CategoryId equals pcm.CategoryId
                  where pcm.PostId == 1
                  select new Category
                  {
                    Name = c.Name,
                    CategoryId = c.CategoryId
                  };
       return query;
}

но это не

public IQueryable<Category> getCategories(int postId)  
{
subnusMVCRepository<Categories> categories = new subnusMVCRepository<Categories>();
subnusMVCRepository<Post_Category_Map> postCategoryMap = new subnusMVCRepository<Post_Category_Map>();

    var query = from c in categories.GetAll()
                join pcm in postCategoryMap.GetAll() on c.CategoryId equals pcm.CategoryId
                where pcm.PostId == postId
                select new Category
                {
                    Name = c.Name,
                    CategoryId = c.CategoryId
                };
    return query;
  }

Ответы [ 2 ]

3 голосов
/ 14 ноября 2008

Скорее всего, проблема в реализации поставщика запросов.

pcm.PostId == 1

и

pcm.PostId == postId

на самом деле есть большая разница. В дереве выражений первое генерируется как выражение ConstantExp, которое не нужно оценивать.

Со вторым компилятор фактически генерирует здесь внутренний класс (это _DisplayClassX, который вы видите). Этот класс будет иметь свойство (скорее всего, будет иметь то же имя, что и ваш параметр), а дерево выражений создаст выражение MemberAccessExpression, которое указывает на автоматически сгенерированный DisplayClassX. Когда ваш поставщик запросов сталкивается с этим, вам нужно скомпилировать () лямбда-выражение и оценить делегата, чтобы получить значение, которое будет использоваться в вашем запросе.

Надеюсь, это поможет.

cosullivan

0 голосов
/ 14 ноября 2008

Проблема не в самом linq, Вы должны быть уверены, что объект контекста или провайдера может извлечь данные. попробуйте проверить

subnusMVCRepository<Categories> categories = new subnusMVCRepository<Categories>();
subnusMVCRepository<Post_Category_Map> postCategoryMap = new subnusMVCRepository<Post_Category_Map>();

объектов и посмотрите, заполнены ли они или ведут себя ли они как требуется.

Возможно, вы захотите найти в сгенерированном коде c__DisplayClass1 и посмотреть, что вы там видите. несколько раз сгенерированный код дозирует некоторые странные вещи.

при входе в код проверяйте локальные значения и значения переменных. это также может дать вам некоторые подсказки.

Редактировать: Вы пытались вернуть коллекцию List <>? или перечислимый тип?

Редактировать: Каков реальный тип элемента , и запрос может быть не повторяемым

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...