c# - 如何组织自定义 SQl 查询集合

标签 c# .net sql sqlite windows-phone-7

我正在使用 SQlite 为 Windows Phone 开发一个应用程序,并且有很多自定义 SQL 查询。喜欢

string query = "SELECT distinct(destinations.name) as Destinations 
                FROM destinations, flights 
                WHERE destinations.d_ID = flights.d_ID 
                AND flights.Date = #" + date.ToShortDateString() + "#";

然后运行:

 var result = (Application.Current as App).db.Query(query);

为了使用 SQlite,我使用了 http://dotnetslackers.com/articles/silverlight/Windows-Phone-7-Native-Database-Programming-via-Sqlite-Client-for-Windows-Phone.aspx#s2-introduction-to-sqlite-client-for-windows-phone 和他们的 DBHelper

我希望所有查询都在一个地方,这样我就可以快速更改它们。

想问一下如何正确操作?

  • 创建一个静态类
  • 使用查询集合创建枚举或字典
  • 使用集合创建一些 XML 或类似文件 -

多谢指教

最佳答案

我认为任何方法都无效,原因如下:

创建一个静态类

这是一个 God object并被视为 anti-pattern ,最好远离它。维护这将是一场噩梦。

使用查询集合创建枚举或字典

现在您拥有的不是 God 对象,而是 God 集合,实际上只是以不同的方式实现相同的反模式。

此外,您将拥有字符串键(或枚举键),并且两者之间没有很强的联系(如果字典由于某种原因没有填充怎么办?)。

使用集合创建一些 XML 或类似文件

有人可能会争辩说,您正在做与字典相同的事情;您必须以某种方式 键入查询,然后进行查找。这是一种非常脆弱的方法。

可能的解决方案

我建议您首先将数据层抽象为逻辑单元。为相关的数据操作创建一个类。

例如,如果您有一些与目的地相关的查询和操作,请创建一个公开这些操作的接口(interface):

public interface IDestinationDataOperations
{
    // Get destinations by date.
    IEnumerable<string> GetDestinationsByDate(DateTime asOf);
}

然后,创建一个实现此特定于 SQL Lite 的类。在您想进行调用的地方,变量是interface 类型。

这样做的好处是:

  • 如果您将实现从 SQL Lite 更改为其他一些底层数据存储(网络服务调用、JSON REST 调用等),您只需更改填充接口(interface)变量的位置(这是 dependency injection 开始的位置)有用),因为您的所有调用都反对抽象

  • 接口(interface)更容易测试:

    • 您可以根据需要的任何测试数据测试直接实现
    • 对于依赖于界面的项目,您可以按照自己喜欢的方式模拟界面,而不需要实际底层数据库进行测试。

然后,对于其他数据操作,您可以清洗、漂洗和重复。

对于奖励积分,你可以把界面分离出来变成一个unit-of-work用于写入和 repository用于读取,具体取决于什么最适合您的需求。

关于c# - 如何组织自定义 SQl 查询集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13609855/

相关文章:

c# - 这个非锁定的 TryGetValue() 字典访问线程安全吗?

c# - 获取类的完全限定名称?

Mysql 选择唯一值+第一次出现+最后一次出现

C# MVC 通过 JQuery AJAX 发送对象

c# - 流流 = WriteableBitmap.PixelBuffer.AsStream() 丢失

sql - 通用 Windows 应用程序的本地数据库

MySQL:返回在 Y 时间内发出超过 X 个请求的用户

mysql - 是否可以使用不同 Excel 工作表中的数据将数据附加到数据库文件?

c# - 使用 FromBase64Transform 解码 base64 文件流

c# - 我们可以在 Linux 机器上读取在 .NET 中序列化的对象吗?