Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/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 to SQL中创建自定义查询_C#_Linq - Fatal编程技术网

C# 在LINQ to SQL中创建自定义查询

C# 在LINQ to SQL中创建自定义查询,c#,linq,C#,Linq,我想使用Linq to SQL构建高级搜索。 我已经使用Linq实现了动态查询,但是DynamicLibrary在某些数据类型(如日期)方面有一个特定的问题。因此,它不能将日期值转换为LINQ并抛出错误。 我已经问过这个问题,但没有得到回答 因此,我开始将我的方法更改为使用Queryable。 这就是我想对Queryable执行的操作: private void button1_Click(object sender, EventArgs e) { LinqTestDat

我想使用Linq to SQL构建高级搜索。
我已经使用Linq实现了
动态查询
,但是
DynamicLibrary
在某些数据类型(如日期)方面有一个特定的问题。因此,它不能将日期值转换为LINQ并抛出错误。
我已经问过这个问题,但没有得到回答
因此,我开始将我的方法更改为使用Queryable。
这就是我想对Queryable执行的操作:

private void button1_Click(object sender, EventArgs e)
    {
        LinqTestDataContext ctx = new LinqTestDataContext("Data Source=.;Initial Catalog=valveManagement2018;Integrated Security=True");
        if (rbvalveStreet.Checked)
        {
            if (!string.IsNullOrEmpty(valveStreet.Text))
            {
                var qry1 = Queryable.Select(Queryable.Where(
                         ctx.valves, p => p.valveStreet.Contains(valveStreet.Text)), p => new { p.valveId, p.aTId,p.typeId, p.valveStreet });
            }
        }
        if (rbtypeId.Checked)
        {
                var qry2 = Queryable.Select(Queryable.Where(
            ctx.valves, p => p.typeId == cbTypeId.selectedIndex), p => new { p.valveId, p.aTId, p.typeId,p.valveStreet });
        }

        var qryFinal = qry1.Concat(qry2);

        dgv.DataSource = qryFinal;
    }
但问题是,Concat的行为类似于
操作数,结果是
qry1或qry2
,但我想得到类似
操作数的东西,比如
qry1和qry2


那么,我如何处理这个问题,或者以任何安全的方式来处理linq to sql中的自定义where?

这应该适用于Linq2Sql,并且更易于遵循:

LinqTestDataContext ctx = new LinqTestDataContext("Data Source=.;Initial Catalog=valveManagement2018;Integrated Security=True");

bool includeValveStreet = rbvalveStreet.Checked,
     includeTypeId = rbtypeId.Checked;

dgv.DataSource = ctx.valves.Where(p => (includeValveStreet && p.valveStreet.Contains(valveStreet.Text))
                                    || (includeTypeId && p.typeId == cbTypeId.selectedIndex)))
                            .Select(p => new { p.valveId, p.aTId,p.typeId, p.valveStreet })
                            .ToList();

这不是自定义的,而是简单的Linq到SQL:

private void button1_Click(object sender, EventArgs e)
    {
        LinqTestDataContext ctx = new LinqTestDataContext("Data Source=.;Initial Catalog=valveManagement2018;Integrated Security=True");
        var data = ctx.valves.AsQueryable();

        if (rbvalveStreet.Checked)
        {
            if (!string.IsNullOrEmpty(valveStreet.Text))
            {
               data = data.Where(p => p.valveStreet.Contains(valveStreet.Text));
            }
        }
        if (rbtypeId.Checked)
        {
               data = data.Where(p => p.typeId == cbTypeId.selectedIndex);
        }

        var qryFinal = data.Select( p => new { p.valveId, p.aTId, p.typeId,p.valveStreet });

        dgv.DataSource = qryFinal.ToList();
    }

我看不出这段代码需要自定义。简单的Linq到SQL就可以了(它实现为“and”而不是“or”)。也许你也应该检查一下Joseph Albahari的predicateBuilder。关于你的另一个问题,有一个答案可以很好地解释如何做到这一点。。。。