C# 在LINQ to SQL中创建自定义查询
我想使用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实现了
动态查询
,但是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。关于你的另一个问题,有一个答案可以很好地解释如何做到这一点。。。。