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 位于名为 MyCatIDsList
的 int[]
或 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()
我很难找到合适的标题 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 位于名为 MyCatIDsList
的 int[]
或 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()