2017-02-14 3 views
0

저는 Linq에 익숙하지 않기 때문에 긴 질문에 대해 사과하겠습니다.기사, 카테고리 및 버전 관리를 다루는 복잡한 Linq 쿼리

기사, 카테고리 및 버전이있는 CMS가 있습니다. 카테고리는 계층 적 (즉, 카테고리에는 ParentID가 있음)이며 약간 복잡한 방식으로 사용하고 있습니다. 다음

데이터 구조는 다음 도메인 간주
enter image description here

카테고리 모든 하위 카테고리 (및 하위 서브 카테고리) 1.
범주 2 및 하위 범주는 모두 기술 자료으로 간주됩니다.

기사는 'n +'도메인 및 하위 (하위) - 도메인 및 'n +'지식 유형과 함께 생성되고 연결됩니다.

예 :
기사 제목 - "청소년 개발"
도메인 - 개발
하위 도메인 - 청소년
하위 하위 도메인 - 미성년자

지식 유형 - 우수 사례

내가해야 할 일 :
1. 최신 버전 아트 목록을 먼저 추출하십시오. (주어진 도메인에서 필터링 됨)
2. 지식 유형별로 그룹화 된 기사 목록

테이블 구조의 복잡성으로 인해 기사 및 버전 (카테고리), 카테고리 및 기사 카테고리 버전) 나는 그것을하기 위해 하나의 linq 쿼리를 생각해 내기가 어렵다.

여기에 단지 최신 버전의 제품을 얻을 수있는 쿼리 :

var articleGroups = from article in _Context.Articles 
           join articleVersion in _Context.ArticleVersions 
            on article.ArticleID equals articleVersion.ArticleID 
           join articleCategoryVersion in _Context.ArticlesCategoriesVersions 
            on articleVersion.ArticleID equals articleCategoryVersion.ArticleID 
           where articleCategoryVersion.CategoryID == 36 
           join articleCategory in _Context.ArticleCategories 
            on articleCategoryVersion.CategoryID equals articleCategory.CategoryID 
           group articleVersion by article.ArticleID into articleGroup 
           select articleGroup.OrderByDescending(x => x.Version).First() into articleOut 
           select new 
           { 
            ArticleID = articleOut.ArticleID, 
            ArticleVersion = articleOut.Version, 
            Title = articleOut.Title 
           }; 

내가 (프로파일 러)를 찾고 1 개 SQL 쿼리를 얻을 좋은이다! 도메인 36과 관련된 기사를 얻습니다.

쿼리가 복잡하게 보입니까?

이제 어떻게 든 결과물을 가져와 지식 유형과 결합하고 그룹화하여 지식 유형별로 그룹화 된 웹 사이트에 기사 목록을 표시 할 수 있습니다. 이 작품 같은

+0

당신은 Article.ArticleVersions''와 같은 탐색 속성을 사용합니다. –

답변

0

겠습니까 뭔가 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      DataTable Articles = new DataTable(); 
      Articles.Columns.Add("ArticleID", typeof(int)); 

      Articles.Rows.Add(new object[] { 1 }); 
      Articles.Rows.Add(new object[] { 2 }); 
      Articles.Rows.Add(new object[] { 3 }); 
      Articles.Rows.Add(new object[] { 4 }); 

      DataTable ArticleVersions = new DataTable(); 
      ArticleVersions.Columns.Add("ArticleID", typeof(int)); 
      ArticleVersions.Columns.Add("Version", typeof(string)); 
      ArticleVersions.Columns.Add("Title", typeof(string)); 

      ArticleVersions.Rows.Add(new object[] { 1, "a", "abc" }); 
      ArticleVersions.Rows.Add(new object[] { 1, "b", "def" }); 
      ArticleVersions.Rows.Add(new object[] { 1, "a", "ghi" }); 
      ArticleVersions.Rows.Add(new object[] { 1, "c", "jkl" }); 
      ArticleVersions.Rows.Add(new object[] { 2, "a", "mno" }); 
      ArticleVersions.Rows.Add(new object[] { 2, "b", "pqr" }); 
      ArticleVersions.Rows.Add(new object[] { 2, "a", "stu" }); 
      ArticleVersions.Rows.Add(new object[] { 3, "c", "vwx" }); 
      ArticleVersions.Rows.Add(new object[] { 4, "a", "yz" }); 
      ArticleVersions.Rows.Add(new object[] { 4, "b", "acd" }); 
      ArticleVersions.Rows.Add(new object[] { 4, "a", "ghi" }); 
      ArticleVersions.Rows.Add(new object[] { 4, "c", "nop" }); 

      DataTable ArticleCategoriesVersions = new DataTable(); 
      ArticleCategoriesVersions.Columns.Add("ArticleID", typeof(int)); 
      ArticleCategoriesVersions.Columns.Add("CategoryID", typeof(int)); 

      ArticleCategoriesVersions.Rows.Add(new object[] { 1, 10 }); 
      ArticleCategoriesVersions.Rows.Add(new object[] { 1, 11 }); 
      ArticleCategoriesVersions.Rows.Add(new object[] { 1, 12 }); 
      ArticleCategoriesVersions.Rows.Add(new object[] { 1, 21 }); 
      ArticleCategoriesVersions.Rows.Add(new object[] { 1, 22 }); 
      ArticleCategoriesVersions.Rows.Add(new object[] { 1, 35 }); 
      ArticleCategoriesVersions.Rows.Add(new object[] { 1, 36 }); 
      ArticleCategoriesVersions.Rows.Add(new object[] { 1, 37 }); 

      DataTable ArticleCategories = new DataTable(); 
      ArticleCategories.Columns.Add("CategoryID", typeof(int)); 
      ArticleCategories.Columns.Add("Name", typeof(string)); 

      ArticleCategories.Rows.Add(new object[] { 10, "article1" }); 
      ArticleCategories.Rows.Add(new object[] { 36, "article2" }); 
      ArticleCategories.Rows.Add(new object[] { 36, "article3" }); 
      ArticleCategories.Rows.Add(new object[] { 36, "article4" }); 
      ArticleCategories.Rows.Add(new object[] { 36, "article5" }); 
      ArticleCategories.Rows.Add(new object[] { 36, "article6" }); 
      ArticleCategories.Rows.Add(new object[] { 36, "article1" }); 

      var results = (from acv in ArticleCategoriesVersions.AsEnumerable() 
          where acv.Field<int>("CategoryID") == 36 
          join ac in ArticleCategories.AsEnumerable() on acv.Field<int>("CategoryID") equals ac.Field<int>("CategoryID") 
          join av in ArticleVersions.AsEnumerable() on acv.Field<int>("ArticleID") equals av.Field<int>("ArticleID") 
          join a in Articles.AsEnumerable() on av.Field<int>("ArticleID") equals a.Field<int>("ArticleID") 
          select new { acv = acv, ac = ac, av = av, a = a }) 
          .GroupBy(x => x.av.Field<int>("ArticleID")) 
          .OrderByDescending(x => x.Key) 
          .Select(x => new { 
           Category1 = x.Where(y => y.av.Field<int>("ArticleID") == 36).Select(y => new { acv = y.acv, ac = y.ac, av = y.av, a = y.a}).ToList(), 
           Category2 = x.GroupBy(y => y.ac.Field<int>("CategoryID"), z => z).ToDictionary(y => y.Key, z => x.ToList()) 
          }).ToList(); 



     } 
    } 



} 
+0

복잡해 보이는 거룩한 쓰레기! 나는 내가 대답을 찾았을지 모른다라고 생각한다. 그러나 나는 아직도 시험하고있다. 일단 내가 돌아와서 그것을 게시 할 – Jacques

+0

내 것이 더 이상 당신보다 복잡하지 않습니다. 몇 가지 테스트 데이터를 추가하여 오류가 있는지 확인하십시오. – jdweng