나는 다음과 같은 기능이 있습니다 :LINQ 쿼리 결과 '유형에 대해 지원되지 System.Linq.IQueryable`1 [선택 System.Int32]
public List<DTO.ArticleDTO> GetRecentArticles(int portalID, int moduleID, int domainID, int rootKnowledgeTypeID, int count)
{
var articles =
(from
article in _Context.Articles.LatestArticles(_Context.ArticleVersions, portalID, moduleID)
where _GetRootDomainsForArticle(article.ArticleID, article.Version, rootKnowledgeTypeID).Contains(domainID)
orderby article.UpdatedOn descending
select new ArticleDTO
{
ArticleID = article.ArticleID,
Title = article.Title,
Summary = article.Introduction,
Content = article.Content,
UpdatedOn = article.UpdatedOn,
Version = article.Version,
KnowledgeTypeText = (from
category in _Context.Categories
join
categoryVersion in _Context.ArticleCategoryVersions
on
category.CategoryID equals categoryVersion.CategoryID
where
categoryVersion.Version == article.Version &&
categoryVersion.ArticleID == article.ArticleID &&
category.ParentID == rootKnowledgeTypeID
select
category.Name
).First()
});
return articles.Take(count).ToList();
}
난 할 노력하고있어 얻을 수있는 모든 루트 카테고리 (도메인 ID)에 속하는 기사. 카테고리는 도메인/하위 도메인으로 간주되며 각 아티클은 하나 이상의 도메인 및 하위 도메인에 속할 수 있습니다. 그래서 위의 linq 쿼리의 where 절에서 다음 메서드를 사용했습니다.
private IQueryable<int> _GetRootDomainsForArticle(int articleID, int version, int rootKnowledgeTypeID)
{
return from c in _Context.Categories
join cv in _Context.ArticleCategoryVersions on c.CategoryID equals cv.CategoryID
where cv.ArticleID == articleID
where cv.Version == version
where c.ParentID == null
where c.CategoryID != rootKnowledgeTypeID
select c.CategoryID;
}
내가 오류입니다 "비교 연산자가 'System.Linq.IQueryable`1 [선택 System.Int32]'유형에 대해 지원되지 않습니다."
나는 지연된 실행 때문에 생각합니다. 그러나 그것을 수행하는 올바른 방법을 이해하지 못합니다.
편집 :
이public List<DTO.ArticleDTO> GetRecentArticles(int portalID, int moduleID, int domainID, int rootKnowledgeTypeID, int count)
{
var articles =
(from
article in _Context.Articles.LatestArticles(_Context.ArticleVersions, portalID, moduleID)
where (from c in _Context.Categories
join cv in _Context.ArticleCategoryVersions on c.CategoryID equals cv.CategoryID
where cv.ArticleID == article.ArticleID
where cv.Version == article.Version
where c.ParentID == null
where c.CategoryID != rootKnowledgeTypeID
select c.CategoryID).Contains(domainID)
orderby article.UpdatedOn descending
select new ArticleDTO
{
ArticleID = article.ArticleID,
Title = article.Title,
Summary = article.Introduction,
Content = article.Content,
UpdatedOn = article.UpdatedOn,
Version = article.Version,
KnowledgeTypeText = (from
category in _Context.Categories
join
categoryVersion in _Context.ArticleCategoryVersions
on
category.CategoryID equals categoryVersion.CategoryID
where
categoryVersion.Version == article.Version &&
categoryVersion.ArticleID == article.ArticleID &&
category.ParentID == rootKnowledgeTypeID
select
category.Name
).First()
});
return articles.Take(count).ToList();
}
Linq에 내 제한된 이해가 나를 인도 : I 메인 쿼리의 일부가되기 위해 _GetRootDomainsForArticle에서 쿼리를 이동하고 일 @SivaGopal 의견을 바탕으로
그 쿼리를 쿼리 컴포지션의 형태로 메서드에 분할 할 수 있고 재사용 가능하게 만들 수 있다고 믿습니다. 그렇지 않은 것 같지만 분명히 쿼리의 부분이 꽤 자주 재사용되는 곳에서 코드를 대폭 줄일 수있는 방법이 있어야합니다.
기본 쿼리에'GetRootDomainsForArticle' 쿼리를 시도 했습니까? 또한 [this so] (https://stackoverflow.com/questions/1230551/comparison-operators-not-support-for-type-system-linq-iqueryable1system-int)가 도움이 될 수 있습니다. –
실제로 작동 한 @SivaGopal! 그 이유는 무엇입니까? GetRootDomainsForArticle 메서드에서 오는 데이터는 다른 메서드에 대해 재사용하고 싶습니다. 그래서 실제로 작동하지 않는 이유를 이해하고 싶습니다. – Jacques
필자의 이해는 지연된 실행으로 인한 것이며 데이터베이스는 어떤 기능을 호출하려고하는지 알지 못합니다. –