我很难找到这篇文章的合适标题。但我有以下几点:
IArticleRepository articleRepo = unitOfWork.ArticleRepository;
List<Article> articles = new List<Article>(
articleRepo.GetAll()
.Where(a => a.Title == searchTerm)
//.Where(a => a.Categories.Contains(Category.))
.OrderByDescending(a => a.CreatedDate));
所以有一些解释:article
除其他外还有Title
和CreateDate
,过滤这些很容易。但article
也与categories
相关联。因此,article
具有类型为array
的{{1}}属性。类型Category
有一个名为Category
的{{1}}类型的属性。
因此,在我的代码中,我已经注释掉了,我正在尝试CategoryId
int
,select
与article
相关联,category
等于..说CategoryId
。
但我发现在我的C#语法中表达这一点非常困难。我也是C#的新手,因此也没有帮助。
答案 0 :(得分:8)
你不需要写两个Where
条款;只需为您的第一个Where
添加另一个条件。第二个条件应使用Any
功能来搜索您要查找的类别。
IArticleRepository articleRepo = unitOfWork.ArticleRepository;
List<Article> articles = new List<Article>(
articleRepo.GetAll()
.Where(a => a.Title == searchTerm &&
a.Categories.Any(c => c.CategoryID == 4))
.OrderByDescending(a => a.CreatedDate));
对于多个类别,假设您在名为int[]
的{{1}}或List<int>
中拥有CategoryID。您可以将上述查询中的categories子句更改为:
MyCatIDsList
答案 1 :(得分:3)
使用LINQ查询时有一种替代语法,更像是SQL。上面的代码是正确的,但您可能会发现此版本更简洁:
int categoryId = 4
IArticleRepository articleRepo = unitOfWork.ArticleRepository;
var articlesQuery = from article in articleRepo.GetAll()
from category in article.Categories
where category.CategoryId == categoryId
where article.Title == searchTerm
orderby article.CreatedDate descending
select article
List<Article> articles = articlesQuery.ToList();
或者更常见的是一步一步完成这些:
int categoryId = 4
List<Article> articles = (
from article in articleRepo.GetAll()
from category in article.Categories
where category.CategoryId == categoryId
where article.Title == searchTerm
orderby article.CreatedDate descending
select article
).ToList()
答案 2 :(得分:2)
您不需要创建新列表,并且可以在一个Where子句中使用多个where表达式。您可以尝试以下代码:
List<Article> articles = articleRepo.GetAll()
.Where(a => a.Title == searchTerm && a.Categories.Contains(Category)).OrderByDescending(a => a.CreatedDate)).ToList();