草庐IT

c# - 在没有数据库上下文的情况下将 LINQ 表达式转换为 SQL 文本

coder 2024-05-28 原文

无论是 LINQ to SQL 还是 LINQ to Entities 都已经具备将 LINQ 转换为 SQL 文本字符串的能力。但我希望我的应用程序在不使用数据库上下文的情况下进行转换——这反过来意味着一个事件的数据库连接——这两个提供程序都需要。

我想将 LINQ 表达式转换为用于 WHEREORDER BY 子句的等效 SQL 字符串,而不依赖于 DB 上下文,以使以下存储库接口(interface)工作:

public interface IStore<T> where T : class 
{
     void Add(T item);
     void Remove(T item);
     void Update(T item);
     T FindByID(Guid id);

     //sure could use a LINQ to SQL converter!
     IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
     IEnumerable<T> FindAll();
}

问题

这主要是我感兴趣的表达式树遍历和转换。有谁知道我可以合并以用于此类自定义上下文的现有库(nuget?)?

事实上,我已经构建了自己的工作“LINQ 转换为 SQL 文本”工具,类似于此 expression tree to SQL example在我上面的存储库中工作。它允许我编写如下代码:

IRepository<Person> repo = new PersonRepository();
var maxWeight = 170;
var results = repo.Find(x => (x.Age > 40 || x.Age < 20) && x.Weight < maxWeight);

但我的代码和那个示例是原始的(并且该示例本身依赖于 LINQ to SQL 数据库上下文)。例如,两者都不处理“LIKE”语句的生成。

我不期望也不需要生成器工具来处理所有可能的 LINQ 查询。例如,我不担心处理和生成连接或包含。事实上,再过大约 20 个小时,我自己的自定义代码可能涵盖我关心的所有情况(主要是“WHERE”和“ORDER BY”语句)。

但同时我觉得我不应该编写自己的自定义代码来执行此操作。如果我坚持自己编写,那么如果有人可以指出我可以反射(reflect)和模仿的特定类(NHibernate、EF 等),我仍然会感兴趣。我问的是要查看的特定类(如果您知道的话),因为我不想花费数小时来筛选大型工具的代码只是为了找到我需要的部分。

这并不重要,但如果有人想知道为什么我不简单地使用 LINQ to SQL 或 LINQ to Entities...对于我的特定应用程序,我更喜欢使用诸如 Dapper 之类的工具。 .

用例 无论是我自己完成构建工具,还是找到第 3 方库,以下是“LINQ to SQL 文本字符串”有用的原因:

  • 我在 IRepository.Find 方法中键入的谓词具有智能感知和基本的编译时检查。
  • 我提议的 IStore 接口(interface)可以实现为数据库访问或网络服务访问。澄清一下,如果我可以将 LINQ“WHERE/ORDER BY”谓词转换为 SQL“WHERE/ORDER BY”子句,那么......
    • Dapper可以直接使用SQL字符串。
    • 与 LINQ 表达式不同,SQL 字符串可以发送到 WCF 服务以用于直接数据库访问(它本身可能没有使用 Dapper)。
    • 可以使用custom code 反序列化SQL 字符串, 返回到 WCF 服务的 LINQ 语句。 Eric Lippert comments on this .
  • UI 可以使用 IQueryable 机制动态生成谓词以提供给存储库

简而言之,这样的工具有助于根据 DDD 实现存储库的“规范”或“查询对象”概念,并且无需依赖 EF 或 LINQ to SQL。

最佳答案

正确地执行此操作确实非常复杂,尤其是如果现在您似乎不太了解表达式树(IQueryable 用来表示查询的内容)。

但如果您真的想开始(或者只是想知道它需要多少工作),请查看 Matt Warren 的 17 集系列 Building an IQueryable provider .

关于c# - 在没有数据库上下文的情况下将 LINQ 表达式转换为 SQL 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15228460/

有关c# - 在没有数据库上下文的情况下将 LINQ 表达式转换为 SQL 文本的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  4. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  5. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  6. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  7. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  8. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  9. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  10. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

随机推荐