使用Linq过滤结果

时间:2015-05-10 07:33:26

标签: c# linq

我的页面上有两个下拉列表。第一个下拉列表显示作者的书籍和其他下拉列表显示状态,即逾期或全部。

如果他们选择“逾期”,那么我需要退回一周以前借来的所有书籍,以便考虑到期日(日期时间变量)。

我目前正在对作者进行正确过滤,如下所示:

  model.ListBooks = (from x in tempModel

                    where ((x.BookAuthor == model.ListAuthors.SelectedAuthor || model.ListAuthors.SelectedAuthor == null))

                    select x).ToList(); // Filter the results

但是一旦我传入额外的搜索过滤器即状态,它就无法向我显示与所选作者匹配的任何书籍,即使我还没有选择状态,这就是它目前的状态。

  model.ListBooks = (from x in tempModel
                     where (
                             (x.BookAuthor == model.ListAuthors.SelectedAuthor || model.ListAuthors.SelectedAuthor == null)
                           && 
                             (model.BookStatus.SelectedStatusId == (int)Enums.Registration.OverDue && x.DueBack < DateTime.Now.)
                           )
                           select x).ToList(); // Filter the results

有人能看到我在这里做错了什么吗?

2 个答案:

答案 0 :(得分:1)

下面:

(model.BookStatus.SelectedStatusId == (int)Enums.Registration.OverDue && x.DueBack < DateTime.Now.)

应该是:

(x.BookStatus.SelectedStatusId == (int)Enums.Registration.OverDue && x.DueBack < DateTime.Now.)

因为你喜欢比较LINQ查询的元素,而不是模型。

答案 1 :(得分:1)

如果选择状态不是OverDue,我认为您的查询失败。在那种情况下你有

where authorFilter && (false && dateFilter)

为您提供false所有图书。因此,您只有两种状态,您只需添加status.SelectedStatusId != (int)Enums.Registration.OverDue检查,就像对选定作者进行空检查一样:

var authors = model.ListAuthors;
var status = model.BookStatus;

model.ListBooks = (from x in tempModel
  where (authors.SelectedAuthor == null || x.BookAuthor == authors.SelectedAuthor) &&
        (status.SelectedStatusId != (int)Enums.Registration.OverDue || x.DueBack < DateTime.Now)
  select x).ToList();

我会在这里使用方法语法来使查询更具可读性:

var books = tempModel; // probably you will need IEnumerable<T> or IQueryable<T> here

if (model.ListAuthors.SelectedAuthor != null)
    books = books.Where(b => b.BookAuthor == model.ListAuthors.SelectedAuthor);

if (model.BookStatus.SelectedStatusId == (int)Enums.Registration.OverDue)
    books = books.Where(b => b.DueBack < DateTime.Now);

model.ListBooks = books.ToList();