![](/img/trans.png)
[英]Cannot implicitly convert type 'System.Linq.IQueryable<int>' to 'int?'
[英]Linq query results in Comparison operators not supported for type '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]'不支持比較運算符。”
我認為是因為執行延遲,但我不太了解正確的執行方式。
編輯:
基於@SivaGopal注釋,我將查詢從_GetRootDomainsForArticle移到了主查詢中,並且它起作用了:
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的有限了解使我相信,可以將查詢分解為一種查詢組合形式的方法,從而使它可重用。 似乎並非如此,但是肯定有一種方法可以這樣做,因為它將大大減少代碼,特別是在查詢的某些部分經常被重用的情況下。
嘗試進一步拆分功能,可以使用冗長而深入的Linq方法,但對於可讀性而言,它不是那么好,並且可能會引入您正在談論的此類錯誤。 我尚未對此進行測試,但它應該有助於解決您的問題:
public List<DTO.ArticleDTO> GetRecentArticles(int portalID, int moduleID, int domainID, int rootKnowledgeTypeID, int count)
{
var allArticles = _Context.Articles.LatestArticles(_Context.ArticleVersions, portalID, moduleID);
var filteredArticles = new List<DTO.ArticleDTO>();
foreach (DTO.ArticleDTO article in allArticles)
{
var domains = _GetRootDomainsForArticle(article.ArticleID, article.Version, rootKnowledgeTypeID);
if (domains.Contains(domainID)
{
filteredArticles.Add(article);
}
}
var articles = filteredArticles.OrderBy(article.UpdatedOn).Descending().Select(article => new DTO.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()
}).Take(count).ToList();
}
您還絕對需要從_GetRootDomainsForArticle函數返回IQueryable <>嗎? 如果可以解決問題,我將嘗試返回IEnumerable <>。
幸田
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.