从多个控件生成LINQ查询
我最近写了一个应用程序(vb.net),用于存储并允许搜索旧的议会计划。
现在,当应用程序运行良好时,前几天,我查看了用于生成SQL字符串以传递数据库的例程,这很糟糕。
我只是在这里发布一个问题,以查看是否有人有更好的方法来做到这一点。
我所拥有的是一个带有一堆控件的表单,这些控件的范围从文本框到单选按钮,每个控件都像数据库过滤器,并且当用户单击搜索按钮时,是一个SQL字符串(我真的希望它成为LINQ查询,因为我已更改为LINQ to SQL)从完成的控件中生成并运行。
我遇到的问题是将这些控件中的每一个与数据库中的字段进行匹配,并有效地生成LINQ查询,而无需执行"如果...则...否则"的操作。陈述。过去,我只是使用控件上的tag属性链接到数据库中的字段名称。
很抱歉,这有点令人困惑,难以描述。只是把它扔在那里,看看是否有人有任何想法。
谢谢
内森
解决方案
回答
我们可以将每个控件包装在一个可以接受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()都没有发生。
回答
在对复杂的即席查询类型的事物进行编程时,属性可以是我们最好的朋友。采用更具说明性的方法,并使用一些自定义属性装饰类,接口和/或者属性,然后编写一些通用的"胶水"代码,将UI绑定到模型。这将使模型和演示变得灵活,而不必更改数千行的控制器逻辑。实际上,这正是Microsoft构建Visual Studio"属性"页面的方式。根据要求,我们甚至可以在产品中使用Microsoft的" EnvDTE.dll"。
回答
我不知道这里的性能,但是如果我们设置LINQ to SQL数据上下文类,则应该能够使用.Select(...)或者.Where(...)查询数据库表。我们应该能够为其中任何一个动态构建lambda表达式。为此,我们可能会研究动态生成lambda表达式。我已经完成了所有工作,直至达到了动态lambda的水平,但这是有可能的。
回答
我不确定100%如何实现这一目标,但是我知道在ASP.NET MVC源代码中哪里是一个不错的起点。在最新版本中,它能够采取形式响应并将其传递到帮助程序方法中,该方法将写入LINQ数据源。
我相信MVC是Cso,如果我们正在寻找VB转换,则可以尝试使用.NET Reflector并将其转换回VB。
回答
我认为我们正在搜索如何创建"动态" Linq查询,这是一个有关如何使用扩展方法库的示例。这些方法采用字符串参数,而不是类型安全的语言运算符。
回答
我不介意sfusco使用属性的方法。我唯一不确定的是将属性添加到哪里,因为如果我添加了设计器代码中的控件声明,那么它将在表单更改时重新生成。
还是我完全误解了sfusco的方法?
回答
我认为也许正确的方法是使用扩展程序提供程序:MSDN文档
然后,我们可以使提供要连接的字段名称,并且可以为扩展程序提供程序传递IQueryable <T>,添加条件并返回IQueryable <T>。