我的页面上有两个下拉列表。第一个下拉列表显示作者的书籍和其他下拉列表显示状态,即逾期或全部。
如果他们选择“逾期”,那么我需要退回一周以前借来的所有书籍,以便考虑到期日(日期时间变量)。
我目前正在对作者进行正确过滤,如下所示:
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
有人能看到我在这里做错了什么吗?
答案 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();