Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于空参数的Linq查询构造_C#_Sql_Linq_Dynamicquery - Fatal编程技术网

C# 基于空参数的Linq查询构造

C# 基于空参数的Linq查询构造,c#,sql,linq,dynamicquery,C#,Sql,Linq,Dynamicquery,我有一个这样的物体: public class Filters { List<string> A { get; set; } List<string> B { get; set; } } SelectResult = (from x in dc.Table where pParameter.A.Any() && pParameter.A.Contains(x.A) where pParame

我有一个这样的物体:

public class Filters
{
    List<string> A { get; set; }
    List<string> B { get; set; }
}
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();
公共类过滤器
{
列出一个{get;set;}
列表B{get;set;}
}
我将使用它作为在数据库上执行查询的函数的参数。 这些ITEN(A和B)将指示“何处”过滤器

请看以下代码:

//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);
//过滤器初始化
过滤器TestFilters=新过滤器();
TestFilters.A=新列表();
TestFilters.B=新列表(新字符串[]{“testfilter1”、“testfilter2”})//其中B==“testfilter1”或B==“testfilter2”
//对数据库执行SELECT的函数的调用
列表结果=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;
}
公共静态列表测试函数(过滤器参数)
{
ExampleDataContext dc=新的ExampleDataContext(Properties.Settings.Default.ExampleConnectionString);
List SelectResult=新建列表();
if(pParameter.A.count!=0&&pParameter.B.count!=0)
选择结果=(从dc.表中的x开始)
其中pParameter.A.包含(x.A)
其中pParameter.B.包含(x.B)
选择x).ToList();
else if(pParameter.A.count==0&&pParameter.B.count!=0)
{
选择结果=(从dc.表中的x开始)
其中pParameter.B.包含(x.B)
选择x).ToList();
}
else if(pParameter.A.count!=0&&pParameter.B.count==0)
{
选择结果=(从dc.表中的x开始)
其中pParameter.A.包含(x.A)
选择x).ToList();
}
else if(pParameter.A.count==0&&pParameter.B.count==0)
{
选择结果=(从dc.表中的x开始)
选择x).ToList();
}       
返回SelectResult;
}
有时A或B是空的,然后我使用“IF”结构来处理它。 也许我会遇到一个问题,我的过滤器更大,超过2个参数,编码会很困难/无聊。
我的问题是:它正在工作,但是有没有其他方法来代替IF?

您可以这样做:

public class Filters
{
    List<string> A { get; set; }
    List<string> B { get; set; }
}
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();
请尝试一下(链接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();
    }
公共静态列表测试函数(过滤器参数)
{
ExampleDataContext dc=新的ExampleDataContext(Properties.Settings.Default.ExampleConnectionString);
var SelectResult=dc.Table;
如果(pParameter.A.count!=0)
SelectResult=从SelectResult中的x开始
其中pParameter.A.包含(x.A)
选择x;
如果(pParameter.B.count!=0)
{
SelectResult=从SelectResult中的x开始
其中pParameter.B.包含(x.B)
选择x;
}
返回SelectResult.ToList();
}

代码很简单。只需使用正确的LINQ语法

//Parameters class
public Class Parameters
{
    public List<string> A {get; set;}
    public List<int> B {get; set;}
}

//some function in a controller
public List<SomeResult> GetResult(Parameters pars)
{
    var db = new DbContext();
    var result = db.SomeResult.Where(s => s.Any(p =>p.SomeString == pars.A
                   || p.SomeInt == pars.B))
            .ToList();
    return result;
}
//参数类
公共类参数
{
公共列表A{get;set;}
公共列表B{get;set;}
}
//控制器中的一些函数
公共列表GetResult(参数PAR)
{
var db=new DbContext();
var result=db.SomeResult.Where(s=>s.Any(p=>p.SomeString==pars.A
||p.SomeInt==第B部分)
.ToList();
返回结果;
}
使用
IQueryable
(dc.Table和
dc.Table.Where()
的类型),您可以链接条件,并仅在按钮行中导出ToList

因此,如果您将
SelectResult
List
更改为
IQueryable
, 每个条件都可以链接到上一个表达式,操作方式如下:

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();
}
公共静态列表测试函数(过滤器参数)
{
ExampleDataContext dc=新的ExampleDataContext(Properties.Settings.Default.ExampleConnectionString);
//全部
IQueryable SelectResult=dc.Table;
//添加条件
如果(pParameter.A.count!=0)
SelectResult=SelectResult.Where(x=>pParameter.A.Contains(x.B));
如果(pParameter.B.count!=0)
SelectResult=SelectResult.Where(x=>pParameter.A.Contains(x.B));
//导出,带有一个\两个\零条件
返回SelectResult.ToList();
}

如果你的情况更复杂(比如多个条件和操作或操作符)考虑使用这个奇妙的工具。

< P>我已经尝试了一些选项,但是不成功。 下面您可以找到适用于我的代码:

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();
List SelectResult=(从dc.Table中的x开始)
其中(pParameter.A.Count!=0?pParameter.A.Contains(x.A):true)
其中(pParameter.B.Count!=0?pParameter.B.Contains(x.B):true)
选择s.ToList();

您应该使用链式linq查询,即旧查询结果与新查询继续。你不应该每次都查询x。嗨,Alex,我已经试过了,但是“Any”不可用。你确定吗?