在lambda中禁用查询

时间:2014-12-10 00:13:43

标签: c# linq lambda

是否可以或如何在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???*/) ||

3 个答案:

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