动态LINQ可枚举选择

时间:2015-09-22 14:39:14

标签: c# linq

我有以下bool变量:

    public bool bCompanyID { get; set; }
    public bool bTaxCode { get; set; }
    public bool bAccountCode { get; set; }

取决于哪些设置为true我设置LINQ表达式(这是一个示例,其中所有三个 true

System.Collections.Generic.IEnumerable<IP_DataRow> items = null;
items = _vm.Result_Error.Where(n => n.CompanyID == SelectedItem.CompanyID && n.TaxCode == SelectedItem.TaxCode && n.AccountCode == SelectedItem.AccountCode);

我想做的(而不是使用多个if语句)是根据用户输入动态创建此表达式。

这样的事情是可能的,还是我只需要使用if语句?

编辑:

以下是我的想法:

                items = _vm.Result_Error.Where(n => ((bCompanyID) ? (n.CompanyID == SelectedItem.CompanyID) : true) && 
                                                    ((bTaxCode) ? (n.TaxCode == SelectedItem.TaxCode) : true) &&
                                                    ((bAccountCode) ? (n.AccountCode == SelectedItem.AccountCode) : true));

我可以使用上面提到的表达式吗?

2 个答案:

答案 0 :(得分:2)

嗯,你可以然后使用类似的东西组合成一个:

System.Collections.Generic.IEnumerable<IP_DataRow> items = null;
items = _vm.Result_Error.Where(n => (!bCompanyID    || n.CompanyID == SelectedItem.CompanyID)
                                 && (!bTaxCode      || n.TaxCode == SelectedItem.TaxCode)
                                 && (!bAccountCode  || n.AccountCode == SelectedItem.AccountCode));

但是if语句可能更清晰,尤其是因为您可以将多个where子句附加到现有查询:

items = _vm.Result_Error.AsEnumerable();
if(bCompanyID)
    items = items.Where(n => n.CompanyID == SelectedItem.CompanyID);
if(bTaxCode)
    items = items.Where(n => n.TaxCode == SelectedItem.TaxCode);
if(bAccountCode)
    items = items.Where(n =>n.AccountCode == SelectedItem.AccountCode);

答案 1 :(得分:1)

您可以将某些条件与if语句结合使用:

var items = _vm.Result.Errors;
if (bCompanyID)
    items = items.Where(n => n.CompanyID == SelectedItem.CompanyID);

if (bTaxCode)
    items = items.Where(n => n.TaxCode == SelectedItem.TaxCode);

. . .

您还可以创建单个LINQ表达式(我认为)不那么有效:

var items = from item in _vm.Result.Errors
            where !bCompanyID || item.CompanyID == SelectedItem.CompanyID
            where !bTaxCode || item.TaxCode == SelectedItem.TaxCode
            . . .
            select item;

在第二种情况下,使用&&||运算符的延迟评估,因此如果bCompanyIDfalse,那么正确的条件将不会进行评估。