【发布时间】:2018-02-17 02:29:43
【问题描述】:
我有以下功能:
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 的有限理解使我相信可以将该查询拆分为一种方法作为查询组合的形式,从而使其可重用。似乎并非如此,但肯定有一种方法可以做到这一点,因为它会大大减少代码,尤其是在查询部分经常被重用的情况下。
【问题讨论】:
-
您是否尝试将
GetRootDomainsForArticle查询内嵌到您的主查询中。 this SO 也可以帮助你。 -
@SivaGopal 确实有效!问题是为什么?来自 GetRootDomainsForArticle 方法的数据是我想为其他方法重用的数据,所以我真的很想了解它为什么不起作用。
-
我的理解是由于延迟执行,你的数据库不知道你要调用什么函数,不是吗?
-
@SivaGopal 我对 Linq 还比较陌生,所以仍然要掌握它,但我认为 _GetRootDomainsForArticle 正在返回 IQueryable,所以我理解它是一种查询组合形式。
-
This SO 可以让您更深入地了解我所说的内容。
标签: c# linq linq-to-sql contains