我有以下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));
我可以使用上面提到的表达式吗?
答案 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;
在第二种情况下,使用&&
和||
运算符的延迟评估,因此如果bCompanyID
为false
,那么正确的条件将不会进行评估。