繁体   English   中英

Linq查询结果不支持类型'System.Linq.IQueryable`1 [System.Int32]的比较运算符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM