我最近写了一个应用程序(vb.net),它存储并允许搜索旧的议会计划。
现在,当应用程序运行良好时,前几天我正在查看用于生成SQL字符串以传递数据库的例程,坦白说,这很糟糕。
我刚刚在这里发帖提问,看看是否还有其他人有更好的办法。
我所拥有的是一个包含从文本框到单选按钮的控件的表单,每个控件都像数据库过滤器,当用户点击搜索按钮时,一个SQL字符串(我真的希望它是一个LINQ查询,因为我已经更改为LINQ to SQL)从已完成的控件生成并运行。
我遇到的问题是将这些控件中的每一个与数据库中的字段进行匹配,并有效地生成LINQ查询,而无需执行一堆“if ... then ... else”。声明。在过去,我刚刚使用控件上的tag属性链接来控制数据库中的字段名称。
如果这有点令人困惑,我很抱歉,它有点难以描述。把它扔出去看看是否有人有任何想法。
由于 森
答案 0 :(得分:0)
你可以将每个控件包装在一个userutrol中,该控件可以接收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
}
然后在完成每个控件后,您的查询将完成,然后您可以.ToList()它。关于LINQ的一个很酷的事情是,直到你.ToList()或.First()它才会发生。
答案 1 :(得分:0)
编写复杂的即席查询类型的东西时,属性可能是你最好的朋友。采用更具声明性的方法并使用一些自定义属性修饰类,接口和/或属性,然后编写一些将UI绑定到模型的通用“粘合”代码。这将使您的模型和演示文稿变得灵活,而无需更改1000行控制器逻辑。实际上,这正是Microsoft构建Visual Studio“属性”页面的方式。根据要求,您甚至可以在产品中使用Microsoft的“EnvDTE.dll”。
答案 2 :(得分:0)
我不知道这里的性能,但如果你设置了LINQ to SQL数据上下文类,你应该能够使用.Select(...)或.Where(...)查询数据库表。 )。您应该能够动态地为其中任何一个构建lambda表达式。您可以考虑为此目的动态生成lambda表达式。我已经完成了动态lambda生成的所有事情,但它是可能的。
答案 3 :(得分:0)
我不是100%确定如何实现这一点,但我知道在ASP.NET MVC源代码中,一个好的起点将在哪里。在最近的版本中,它能够获取表单响应并将其传递给辅助方法,该方法可以写入LINQ数据源。
我相信MVC是C#所以如果你正在寻找VB翻译,你可以尝试使用.NET Reflector并将其转换回VB。
答案 4 :(得分:0)
我认为您正在搜索如何创建“动态”Linq查询,Here是一个关于如何使用扩展方法库执行此操作的示例。这些方法采用字符串参数而不是类型安全的语言运算符。
答案 5 :(得分:0)
我不介意使用属性的sfusco方法。我唯一不确定的是将属性附加到哪里因为如果我附加到设计器代码中的控件声明,它将在表单更改时重新生成。
还是我完全误解了sfusco的方法?
答案 6 :(得分:0)
我认为这样做的正确方法可能是扩展提供者:MSDN documentation
然后,您可以使用编辑器提供要连接的字段名称,并且您的扩展程序提供程序可以传递IQueryable&lt; T&gt;,添加条件,并返回IQueryable&lt; T&gt;。