是否可以或如何在lambda表达式中禁用查询?
例如,如果我有一个复选框,每个查询可以禁用,如果没有选中。
“如果我有EmployeeNumber
的复选框并取消选中,则会禁用或跳过查询。”
ViewBag.dataGWUTA = from user in db.ActiveDirectory2.Where(users =>
//Disable if not checked
(!String.IsNullOrEmpty(search) ? users.EmployeeNumber.Contains(search) : users.EmployeeNumber == null) ||
//Disable if not checked
(!String.IsNullOrEmpty(search) ? users.SamAccountName.Contains(search) : users.SamAccountName == null) ||
//Disable if not checked
(!String.IsNullOrEmpty(search) ? users.GivenName.Contains(search) : users.GivenName == null) ||
//Disable if not checked
(!String.IsNullOrEmpty(search) ? users.Surname.Contains(search) : users.Surname == null) ||
//Disable if not checked
(!String.IsNullOrEmpty(search) ? users.EmailAddress.Contains(search) : users.EmailAddress == null) ||
//Disable if not checked
(!String.IsNullOrEmpty(search) ? users.Guid.Contains(search) : users.Guid == null) ||
//Default
(!String.IsNullOrEmpty(search) ? users.SID.Contains(search) : users.SID == null))
where user.DateCreated >= created && user.DateModified <= modified
select user;
我尝试使用preprocessor directives
但是它对我的复选框没用,因为你需要在using directives
的顶部定义条件。
例如
#define EmployeeNumber
using System;
...
#if EmployeeNumber
//Disable if not checked
(!String.IsNullOrEmpty(search) ? users.EmployeeNumber.Contains(search) : users.EmployeeNumber == null) ||
#elif SamAccountName
....
更新
我们可以这样做 - “但我不知道应该放入什么else(:)
”
(EmployeeNumber.Checked ? (!String.IsNullOrEmpty(search) ? users.EmployeeNumber.Contains(search) : users.EmployeeNumber == null) : /*What should I put here???*/) ||
答案 0 :(得分:2)
你能做这样的事吗?
var query = from user in db.ActiveDirectory2
where // base query criteria
select user;
// Check if EmployeeNumber is checked
if(EmployeeNumber.Checked) {
query = from q in query
where // clause on employee number
select q;
}
您可以继续根据可能选择的任何UI设置构建linq查询过滤。
答案 1 :(得分:1)
这是我有时喜欢做这种事情的方式。它有点像,但我喜欢它,因为我可以非常巧妙地压缩所有选项,我也可以在运行时动态更改代码。
首先从一些基本值开始(这些值模拟您构建查询的复选框和值):
var hasFirstName = true;
var firstName = "Fred";
var hasAgeMinimum = true;
var ageMinimum = 18;
现在设置查询及其适用时间的条件:
var filters = new Dictionary<Func<bool>, Func<IQueryable<User>, IQueryable<User>>>()
{
{ () => hasFirstName, users => users.Where(user => user.Name == firstName) },
{ () => hasAgeMinimum, users => users.Where(user => user.Age > ageMinimum) },
};
然后构建最终查询变得非常容易:
var query =
filters
.Aggregate(
db.ActiveDirectory2,
(q, f) => f.Key() ? f.Value(q) : q);
是。就是这样。
我在发布之前测试了这个,并提供了一些基本数据,它就像是一种享受。
答案 2 :(得分:0)
好的,Mad Sorcerer回答是
(!checkBox1.Checked || (!String.IsNullOrEmpty(search) ? users.EmployeeNumber.Contains(search) : users.EmployeeNumber == null)) || ...
但问题是未选中checkBox.Checked
或条件为真时 (!false) ||..
查询将停止或不会继续其他条件。
但是由于他的回答我找到了解决方案:
因此,为了让条件继续到其他条件,它必须始终视为错误。
(Bool ? (?:) : false) || ...
在这种情况下,条件将始终继续。
查看我的完整解决方案:
ViewBag.dataGWUTA = from user in db.ActiveDirectory2.Where(users =>
//Disable if not checked
(checkBox1.Checked ? (!String.IsNullOrEmpty(search) ? users.EmployeeNumber.Contains(search) : users.EmployeeNumber == null) : false) ||
//Disable if not checked
(checkBox1.Checked ? (!String.IsNullOrEmpty(search) ? users.SamAccountName.Contains(search) : users.SamAccountName == null) : false) ||
//Disable if not checked
(checkBox1.Checked ? (!String.IsNullOrEmpty(search) ? users.GivenName.Contains(search) : users.GivenName == null) : false) ||
//Disable if not checked
(checkBox1.Checked ? (!String.IsNullOrEmpty(search) ? users.Surname.Contains(search) : users.Surname == null) : false) ||
//Disable if not checked
(checkBox1.Checked ? (!String.IsNullOrEmpty(search) ? users.EmailAddress.Contains(search) : users.EmailAddress == null) : false) ||
//Disable if not checked
(checkBox1.Checked ? (!String.IsNullOrEmpty(search) ? users.Guid.Contains(search) : users.Guid == null) : false) ||
//Default
(checkBox1.Checked ? (!String.IsNullOrEmpty(search) ? users.SID.Contains(search) : users.SID == null) : false))
where user.DateCreated >= created && user.DateModified <= modified
select user;