1

我最近编写了一个应用程序(vb.net),它存储并允许搜索旧的议会计划。现在,虽然应用程序运行良好,但前几天我正在查看用于生成 SQL 字符串以传递数据库的例程,坦率地说,它很糟糕。
我只是在这里发布一个问题,看看是否有其他人有更好的方法来做到这一点。

我拥有的是一个带有一堆控件的表单,从文本框到单选按钮,每个控件都像数据库过滤器,当用户点击搜索按钮时,一个 SQL 字符串(我真的希望它是一个 LINQ 查询,因为我已更改为 LINQ to SQL)从完成的控件生成并运行。

我遇到的问题是将这些控件中的每一个与数据库中的一个字段进行匹配,并有效地生成一个 LINQ 查询,而无需执行一堆“if ...then ...else”。陈述。过去我只是使用控件上的标记属性将控件链接到数据库中的字段名称。

如果这有点令人困惑,我很抱歉,它有点难以描述。只是把它扔在那里,看看是否有人有任何想法。

谢谢内森

4

7 回答 7

0

您可以将每个控件包装在一个用户控件中,该控件可以接受 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() 之前什么都不会发生。

于 2008-09-17T01:40:50.583 回答
0

在编写复杂的 ad-hoc 查询类型的东西时,属性可能是你最好的朋友。采用更具声明性的方法并使用一些自定义属性装饰您的类、接口和/或属性,然后编写一些通用的“胶水”代码将您的 UI 绑定到您的模型。这将使您的模型和演示变得灵活,而无需更改 1000 行控制器逻辑。事实上,这正是微软构建 Visual Studio“属性”页面的方式。您甚至可以根据需要在您的产品中使用 Microsoft 的“EnvDTE.dll”。

于 2008-09-17T01:45:08.450 回答
0

我不知道这里的性能,但是如果您设置 LINQ to SQL 数据上下文类,您应该能够使用 .Select(...) 或 .Where(...) 查询数据库表。您应该能够为其中任何一个动态构建 lambda 表达式。您可能会为此目的研究 lambda 表达式的动态生成。我已经完成了动态 lambda 生成的所有工作,但这是可能的。

于 2008-09-17T01:46:53.470 回答
0

我不是 100% 确定如何实现这一点,但我知道在 ASP.NET MVC 源代码中是一个好的起点。在最近的版本中,它能够获取表单响应并将其传递给辅助方法,该方法执行写入 LINQ 数据源的操作。

我相信 MVC 是 C#,所以如果您正在寻找 VB 翻译,您可以尝试使用 .NET Reflector 并将其转换回 VB。

于 2008-09-17T01:52:31.333 回答
0

我认为您正在搜索如何创建“动态”Linq 查询,这里有一个关于如何使用扩展方法库的示例。这些方法采用字符串参数而不是类型安全的语言运算符。

于 2008-09-17T02:11:44.890 回答
0

我不介意 sfusco 使用属性的方法。我唯一不确定的是将属性附加到哪里,因为如果我附加到设计器代码中的控件声明,它将在表单更改时重新生成。

还是我完全误解了 sfusco 的方法?

于 2008-09-17T02:24:27.123 回答
0

我认为这样做的正确方法可能是扩展器提供程序:MSDN 文档

然后,您可以使用编辑器提供要连接的字段名称,并且可以向您的扩展程序提供程序传递一个 IQueryable<T>、添加条件并返回一个 IQueryable<T>。

于 2008-09-17T02:26:56.370 回答