我有一个这样的对象:
public class Filters
{
List<string> A { get; set; }
List<string> B { get; set; }
}
我将它用作将在数据库上执行查询的函数的参数。 这些,A和B,将指示&#34;其中&#34;过滤器。
请查看以下代码:
//Filters Initialization
Filters TestFilters = new Filters();
TestFilters.A = new List<string>();
TestFilters.B = new List<string>(new string[] {"testfilter1","testfilter2"}); //WHERE B == "testfilter1" OR B == "testfilter2"
//Call of the function that executes SELECT on DB
List<Table> Result = TestFunction(TestFilter);
功能:
public static List<Table> TestFunction(Filters pParameter)
{
ExampleDataContext dc = new ExampleDataContext(Properties.Settings.Default.ExampleConnectionString);
List<Table> SelectResult = new List<Table>();
if (pParameter.A.count != 0 && pParameter.B.count != 0)
SelectResult = (from x in dc.Table
where pParameter.A.Contains(x.A)
where pParameter.B.Contains(x.B)
select x).ToList();
else if (pParameter.A.count == 0 && pParameter.B.count != 0)
{
SelectResult = (from x in dc.Table
where pParameter.B.Contains(x.B)
select x).ToList();
}
else if (pParameter.A.count != 0 && pParameter.B.count == 0)
{
SelectResult = (from x in dc.Table
where pParameter.A.Contains(x.A)
select x).ToList();
}
else if (pParameter.A.count == 0 && pParameter.B.count == 0)
{
SelectResult = (from x in dc.Table
select x).ToList();
}
return SelectResult;
}
有时A或/和B是空的,那么我正在使用&#34; IF&#34;处理它的结构。 也许我可能遇到一个问题,我的过滤器更大,超过2个参数,并且编码很难/无聊。 我的问题是:它正在运行,但还有另一种方法,而不是使用IF?
答案 0 :(得分:1)
请试一试(链式linq),我只是手工重写并且没有编译或运行:
public static List<Table> TestFunction(Filters pParameter)
{
ExampleDataContext dc = new ExampleDataContext(Properties.Settings.Default.ExampleConnectionString);
var SelectResult = dc.Table;
if (pParameter.A.count != 0)
SelectResult = from x in SelectResult
where pParameter.A.Contains(x.A)
select x;
if (pParameter.B.count != 0)
{
SelectResult = from x in SelectResult
where pParameter.B.Contains(x.B)
select x;
}
return SelectResult.ToList();
}
答案 1 :(得分:0)
您可以这样做:
SelectResult = (from x in dc.Table
where pParameter.A.Any() && pParameter.A.Contains(x.A)
where pParameter.B.Any() && pParameter.B.Contains(x.B)
select x).ToList();
答案 2 :(得分:0)
代码很简单。只需使用正确的LINQ语法。
let a = {};
a.self = a;
答案 3 :(得分:0)
使用IQueryable<Table>
(类型dc.Table
和dc.Table.Where()
),您可以链接条件,并仅在buttom行中导出ToList。
所以如果你将SelectResult
从List<Table>
更改为IQueryable<Table>
,
每个条件都可以链接到前一个表达式,就像AND:
public static List<Table> TestFunction(Filters pParameter)
{
ExampleDataContext dc = new ExampleDataContext(Properties.Settings.Default.ExampleConnectionString);
//all
IQueryable<Table> SelectResult = dc.Table;
//add conditions
if (pParameter.A.count != 0 )
SelectResult = SelectResult.Where(x => pParameter.A.Contains(x.B));
if (pParameter.B.count != 0)
SelectResult = SelectResult.Where(x => pParameter.A.Contains(x.B));
//export, with one\two\zero conditions
return SelectResult.ToList();
}
如果您的案例更复杂(例如多个条件和OR运算符),请考虑使用精彩工具PredicateBuilder。
答案 4 :(得分:0)
我尝试了一些选项,但不成功。 您可以在下面找到适合我的代码:
List<Table> SelectResult = (from x in dc.Table
where (pParameter.A.Count != 0 ? pParameter.A.Contains(x.A) : true)
where (pParameter.B.Count != 0 ? pParameter.B.Contains(x.B) : true)
select s).ToList();