IQueryable where子句

时间:2015-02-20 09:05:15

标签: c# linq iqueryable

我很难找到这篇文章的合适标题。但我有以下几点:

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除其他外还有TitleCreateDate,过滤这些很容易。但article也与categories相关联。因此,article具有类型为array的{​​{1}}属性。类型Category有一个名为Category的{​​{1}}类型的属性。

因此,在我的代码中,我已经注释掉了,我正在尝试CategoryId intselectarticle相关联,category等于..说CategoryId

但我发现在我的C#语法中表达这一点非常困难。我也是C#的新手,因此也没有帮助。

3 个答案:

答案 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();