基于空参数的Linq查询构造

时间:2017-07-03 01:49:45

标签: c# sql linq dynamicquery

我有一个这样的对象:

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?

5 个答案:

答案 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.Tabledc.Table.Where()),您可以链接条件,并仅在buttom行中导出ToList。

所以如果你将SelectResultList<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();