Ich habe die folgende Funktion:Linq Abfrage-Ergebnisse in Vergleichsoperatoren nicht für Typ unterstützt ‚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();
}
Was ich versuche zu tun ist, bekommen alle Artikel, die zu einer Stammkategorie (Domänen-ID) gehören. Kategorien werden als Domänen/Subdomänen angesehen und jeder Artikel kann zu einer oder mehreren Domänen und Unterdomänen gehören. Deshalb habe ich die folgende Methode in der where-Klausel der obigen linq-Abfrage verwendet.
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;
}
Der Fehler, den ich bekommen ist: "Vergleichsoperator nicht für Typen unterstützt 'System.Linq.IQueryable`1 [System.Int32]'."
Ich denke, ist wegen der verzögerten Ausführung, aber ich verstehe nicht ganz den richtigen Weg, es zu tun.
Edit:
Basierend auf @SivaGopal Kommentar ich die Abfrage aus dem _GetRootDomainsForArticle bewegte Teil der Hauptabfrage zu werden, und es hat funktioniert:
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();
}
Mein begrenztes Verständnis von Linq mir führen zu Ich glaube, man könnte diese Anfrage auf eine Methode als Form der Abfragezusammensetzung aufteilen und sie dadurch wiederverwendbar machen. Scheint nicht der Fall zu sein, aber sicherlich muss es einen Weg geben, dies zu tun, da es den Code drastisch reduzieren würde, besonders dort, wo Teile von Abfragen häufig wiederverwendet werden.
Haben Sie versucht, in-Auskleiden der 'GetRootDomainsForArticle' Abfrage in Ihre Hauptabfrage. Auch [dieses SO] (https://stackoverflow.com/questions/1230551/comparison-operators-not-supported-for-type-system-linq-iqueryable1system-int) kann Ihnen helfen. –
@SivaGopal das hat tatsächlich funktioniert! Die Frage ist warum? Die Daten, die von der GetRootDomainsForArticle-Methode stammen, möchte ich für andere Methoden wiederverwenden. Daher würde ich gerne verstehen, warum das nicht funktioniert. – Jacques
Mein Verständnis ist aufgrund der verzögerten Ausführung, Ihre Datenbank ist nicht bewusst, welche Funktion versuchen Sie anzurufen, nicht wahr? –