0

私はまだLINQとエンティティframweworkにあまり精通していません。

データベースからサイトマップを取得してXMLに書き込む必要があります。

主な問題は、次のコードでサブクエリが何も表示しないことです。

var pages = (from p in ctx.CMSPages2
                 where p.MenuID == num && p.ParentID == 0
                 select new
                 {
                     URLLevel1 = p.KeywordUrl + "/" + p.FriendlyUrl,
                     TitleLevel1 = p.LinkTitle,
                     Level2 = from q in ctx.CMSPages2
                              where q.ParentID == p.SitemapExternID
                              select new
                              {
                                  URLLevel2 = q.KeywordUrl + "/" + q.FriendlyUrl,
                                  TitleLevel2 = q.LinkTitle,
                              }


                 }).ToArray();

何か案は?

アップデート:

ナビゲーションプロパティ(CMSPages2_1)を使用すると、次のようなトリックが実行されました。

 var pages = (from p in ctx.CMSPages2
                 where p.MenuID == num && p.ParentID == 0
                 select new
                 {
                     URLLevel1 = p.KeywordUrl + "/" + p.FriendlyUrl,
                     TitleLevel1 = p.LinkTitle,
                     Level2 = (from o in p.CMSPages2_1
                               where o.ParentID == p.SitemapExternID
                               select new
                               {
                                   URLLevel2 = o.KeywordUrl + "/" + o.FriendlyUrl,
                                   TitleLevel2 = o.LinkTitle,
                               })






                 }).ToArray();
4

1 に答える 1

0

Level2 のサブクエリはコレクションを返しますが、単一オブジェクトのプロパティを設定しようとしているようです。

FirstOrDefault を使用してみてください:

var pages = (from p in ctx.CMSPages2
         where p.MenuID == num && p.ParentID == 0
         select new
         {
            URLLevel1 = p.KeywordUrl + "/" + p.FriendlyUrl,
            TitleLevel1 = p.LinkTitle,
            Level2 = ctx.CMSPages2
                .FirstOrDefault(q => q.ParentID == p.SitemapExternID) 
                .Select(x => new
                    {
                        URLLevel2 = x.KeywordUrl + "/" + x.FriendlyUrl,
                        TitleLevel2 = x.LinkTitle,
                    });


        }).ToArray();

更新:これが木だとは気づきませんでした。

おそらく、CMSPages2 のナビゲーション プロパティを istelf ("SubPages" など) に設定してから、次のようにしてみてください。

var pages = (from p in ctx.CMSPages2
         where p.MenuID == num && p.ParentID == 0
         select new
         {
            URLLevel1 = p.KeywordUrl + "/" + p.FriendlyUrl,
            TitleLevel1 = p.LinkTitle,
            Level2 = p.SubPages
                .Select(q => new
                    {
                        URLLevel2 = q.KeywordUrl + "/" + q.FriendlyUrl,
                        TitleLevel2 = q.LinkTitle,
                    });


        }).ToArray();
于 2012-05-04T21:59:39.753 に答える