IQueryable where 子句

IQueryable where clause

我很难找到合适的标题 post。但我有以下内容:

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 属性 类型 Category。类型 Category 有一个名为 CategoryId 的 属性 类型 int

所以在我的代码中它被注释掉了,我正在尝试 select 一个 article,它有一个与之关联的 category,谁是 CategoryId等于.. 说 4.

但我发现很难用我的 C# 语法表达这一点。我也是 C# 的新手,所以这也无济于事。

您无需创建新列表,您可以在一个 Where 子句中使用多个 where 表达式。你能试试下面的代码吗:

List<Article> articles = articleRepo.GetAll()
                     .Where(a => a.Title == searchTerm && a.Categories.Contains(Category)).OrderByDescending(a => a.CreatedDate)).ToList();  

你不需要写两个 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));  

对于多个类别,假设您的类别 ID 位于名为 MyCatIDsListint[]List<int> 中。他们可以将上述查询中的类别子句更改为:

              a.Categories.Any(c => MyCatIDsList.Contains(c.CategoryID))

使用 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()