Sql 从多个控件生成LINQ查询
我最近编写了一个应用程序(vb.net),它存储并允许搜索旧的议会计划。 现在,虽然应用程序运行良好,但前几天我正在查看用于生成SQL字符串以传递数据库的例程,坦率地说,它很糟糕。Sql 从多个控件生成LINQ查询,sql,linq,Sql,Linq,我最近编写了一个应用程序(vb.net),它存储并允许搜索旧的议会计划。 现在,虽然应用程序运行良好,但前几天我正在查看用于生成SQL字符串以传递数据库的例程,坦率地说,它很糟糕。 我只是在这里发布了一个问题,看看是否有其他人有更好的方法来做这件事 我所拥有的是一个表单,它包含从文本框到单选按钮的一系列控件,每个控件都类似于数据库过滤器,当用户点击搜索按钮时,从完成的控件生成一个SQL字符串(我真的希望它是一个LINQ查询,因为我已经改为LINQ to SQL)并运行 我遇到的问题是将这些控件中
我只是在这里发布了一个问题,看看是否有其他人有更好的方法来做这件事 我所拥有的是一个表单,它包含从文本框到单选按钮的一系列控件,每个控件都类似于数据库过滤器,当用户点击搜索按钮时,从完成的控件生成一个SQL字符串(我真的希望它是一个LINQ查询,因为我已经改为LINQ to SQL)并运行 我遇到的问题是将这些控件中的每个控件与数据库中的一个字段相匹配,并高效地生成LINQ查询,而无需执行一系列“if…then…else.”语句。在过去,我只是使用控件上的tag属性将控件链接到数据库中的字段名 如果这有点让人困惑,我很抱歉,这有点难以描述。把它扔出去看看有没有人有什么想法 谢谢
Nathan您可以将每个控件包装在一个usercontrol中,该usercontrol可以接受IQueryable,并在保证的情况下附加到查询中 因此,您的页面代码可能类似于
var qry = from t in _db.TableName
select t;
然后将qry传递给每个用户控件上的方法
IQueryable<t> addToQueryIfNeeded(IQueryable<t> qry)
{
if(should be added)
return from t in qry
where this == that
select t;
else
return qry
}
iqeryable addtoqueryifneed(iqeryable qry)
{
如果(应添加)
在qry中从t返回
这里这个==那个
选择t;
其他的
返回qry
}
然后,在遍历每个控件之后,您的查询将完成,然后就可以了。ToList()将其删除。LINQ最酷的一点是,在.ToList()或.First()调用它之前,什么都不会发生。在编写复杂的即席查询类型的程序时,属性可以是您最好的朋友。采用更具声明性的方法,用一些自定义属性装饰类、接口和/或属性,然后编写一些通用的“粘合”代码,将UI绑定到模型。这将使您的模型和表示更加灵活,无需更改1000行控制器逻辑。事实上,这正是微软构建VisualStudio“属性”页面的方式。根据需要,您甚至可以在产品中使用Microsoft的“EnvDTE.dll”。我不知道这里的性能,但是如果您设置LINQ to SQL数据上下文类,您应该能够使用.Select(…)或.Where(…)查询数据库表。您应该能够动态地为其中任何一个构建lambda表达式。为此,您可以研究lambda表达式的动态生成。我已经做了所有的事情,直到动态lambda生成,但这是可能的 我不是100%确定如何实现这一点,但我知道在ASP.NET MVC源代码中应该从哪里开始。在最近的版本中,它能够接受表单响应并将其传递到一个helper方法中,该方法对LINQ数据源进行写入
我相信MVC是C#所以如果你在寻找VB翻译,你可以尝试使用.NET Reflector并将其转换回VB。我认为你在寻找如何创建“动态”Linq查询,这是一个关于如何使用扩展方法库来实现的示例。这些方法采用字符串参数而不是类型安全的语言运算符。我不介意sfusco使用属性的方法。我唯一不确定的是属性要附加到哪里,因为如果我附加到设计器代码中的控件声明上,它将在表单更改时重新生成
还是我完全误解了sfusco的方法?我认为也许正确的方法是使用扩展器提供商:
然后,您可以使用编辑器提供要连接的字段名,您的扩展程序提供程序可以传递一个IQueryable,添加条件,然后返回一个IQueryable。我不介意这种方法,但我希望避免为此编写一堆自定义控件。您能给我举一个通用“粘合”代码的示例吗。