0

どうしてこの仕事

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

2 に答える 2

3

この問題は、クエリ プロバイダーの実装にある可能性が最も高いです。

pcm.PostId == 1

pcm.PostId == postId

実は大きな違いがあります。式ツリーでは、最初のものは評価する必要のない ConstantExpression として生成されます。

2 つ目では、コンパイラは実際にここで内部クラスを生成します (これは、表示されている _DisplayClassX です)。このクラスにはプロパティがあり (ほとんどの場合、パラメーターと同じ名前になります)、式ツリーは、自動生成された DisplayClassX を指す MemberAccessExpression を作成します。クエリ プロバイダーがこれに遭遇したら、Lambda 式を Compile() し、デリゲートを評価して、クエリで使用する値を取得する必要があります。

お役に立てれば。

コサリバン

于 2008-11-14T13:50:29.803 に答える
0

問題は linq 自体ではありません。コンテキストまたはプロバイダー オブジェクトがデータをフェッチできることを確認する必要があります。をテストしてみてください

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

オブジェクトが取り込まれているかどうか、または必要に応じて動作しているかどうかを確認します。

生成されたコードで c__DisplayClass1 を検索し、そこに表示される内容を確認することをお勧めします。生成されたコードが奇妙なことをすることがあります。

コードに足を踏み入れるときは、ローカルと変数の値を確認してください。これはまた、いくつかの手がかりを与えるかもしれません。

編集: List<> コレクションを返そうとしましたか? または列挙型?

編集:アイテムの実際のタイプは何ですか?クエリは反復可能ではない場合があります

于 2008-11-14T11:35:39.640 に答える