在ORM中以字符串格式使用sql是一种好习惯

时间:2013-05-31 10:54:21

标签: c# jquery orm

我在ORM(Bltoolkit)中使用字符串格式的sql。我不喜欢在没有需要的情况下使用Linq,因为

  • 使用Linq很难构建复杂的查询。使用Linq构建复杂查询的资源不足。
  • 使用带有ORM的字符串sql,您仍然在改进sql查询的练习。否则你有一个查询中断(我想Linq不会改进你的sql查询)。
  • 您仍然可以通过绑定参数保护sql注入查询。

你的想法是什么?这是一个好习惯吗?

在没有Linq的情况下使用ORM(对于我的情况,BlToolkit)的示例如下:

        var db = new Veritabani("HstConn");

        try
        {
            var sorgu = @"select t.tcno ""KullaniciAdi"", t.ad ""Ad"", t.soyad ""Soyad"", t.kurum_kodu ""KurumKodu"", 
                                 t.ilkodu ""IlKodu"", t.kurum_turu ""KurumTuru"", t.e_posta ""Eposta"", t.dogrulama_kodu ""DogrulamaKodu""
                            from saglikcalisanlari t
                           where tcno = :kullaniciAdi
                             and sifre = :sifre";

            return db.SetCommand(sorgu,
                                 db.Parameter(":kullaniciAdi", kullaniciAdi.Trim()),
                                 db.Parameter(":sifre", sifre.Trim().Md5Hash())).ExecuteObject<SaglikCalisani>();
        }
        catch (Exception exc)
        {
            throw new Exception("Veritabanı Hatası: " + exc.Message);
        }
        finally
        {
            db.Close();
            db.Dispose();
        }

3 个答案:

答案 0 :(得分:2)

这将始终是主观的和上下文相关的。也许真正的问题是“你真的会针对不同的数据库”。如果答案是“否”,则修复SQL很可能很好。如果你需要针对多个不同的后端,那么像HQL或ESQL这样的抽象可能更合适 - 这与LINQ不同,但仍然是平台独立的... ish。

在很多情况下,你想要手动调整SQL,因为在复杂的情况下,开发人员会在10次中超出发生器(LINQ等)9次(根据欧盟部门的一项研究)发明统计数据)。

只要你正确参数化,在这些场景中,SQL本身就很好

stackoverflow.com广泛使用手写的TSQL ,因为:

  • 我们没有计划改变后端,如果我们做的话:查询只是冰山一角
  • 我们真的非常关心表现:
    • 解析表达式树(LINQ)或DSL(HSQL / ESQL)以生成TSQL需要时间
    • 我们希望TSQL能够很好地编写和测试
    • 我们真正看到我们 使用的工具中的测量性能问题,即使使用预编译的LINQ查询
  • 我们编写了自己的工具(“dapper”)来删除我们没有绝对需要的所有功能 - 使其成为简单的查询输入,对象输出
  • 和我们自己的工具(“迷你探查器”)来监控网站上的现场表现

答案 1 :(得分:1)

你所提到的原因是选择字符串格式的完美原因,性能方面你会发现很少有差别去虔诚地去做一个。

想法是使用可以提高工作效率的工具,而不会要求您放弃应用程序的性能。

就像你喜欢LINQ上的SQL查询并且对它感觉更舒服一样,我没有看到任何不利之处,另一方面如果你不想使用LINQ因为它占用了很多你并且你发现它很难是时候努力去学习它了。除非你能比较你的工具,否则你无法选择最适合你的工具。

答案 2 :(得分:0)

查看NPoco - 它基于PetaPoco,但最近有一些增强功能。

使用SQL字符串构建器构建SQL字符串要容易得多,如果您愿意,最新版本还可以使用LINQ。