将LINQ表达式转换为没有DB Context的SQL Text

Bre*_*ias 12 .net c# sql linq expression-trees

LINQ to SQL或LINQ to Entities已经能够将LINQ转换为SQL文本字符串.但是我希望我的应用程序在不使用db上下文的情况下进行转换 - 这反过来意味着一个活动的数据库连接 - 这两个提供者都需要.

我想将LINQ表达式转换为等效的SQL字符串for WHEREORDER BYclauses,而不需要DB上下文依赖项,以使以下存储库接口工作:

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();
}
Run Code Online (Sandbox Code Playgroud)

它主要是我感兴趣的表达式树遍历和变换.有没有人知道我可以合并的现有库(nuget?)在这样的自定义上下文中使用?

因为它已经构建了我自己的工作"LINQ转换为SQL文本"工具,类似于这个表达式树到SQL示例,它在我上面的存储库中工作.它允许我编写这样的代码:

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

但我的代码和该示例是原始的(该示例本身依赖于LINQ to SQL db上下文).例如,既不处理"LIKE"语句的生成.

我不期望或需要一个处理所有可想到的LINQ查询的生成器工具.例如,我并不担心处理和生成连接或包含.事实上,另外约20个小时我自己的自定义代码可能涵盖我关心的所有情况(主要是"WHERE"和"ORDER BY"语句).

但与此同时,我觉得我不应该编写自己的自定义代码来执行此操作.如果我不能写自己的话,那么我仍然会感兴趣,如果有人能指出我能反映和模仿的特定课程(NHibernate,EF等).如果你了解它,我会询问特定的课程,因为我不想花费数小时来筛选大量工具的代码,只是为了找到我需要的部分.

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

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

  • 我在IRepository.Find方法中输入的谓词具有智能感知和基本编译时检查.
  • 我建议的IStore接口可以实现数据库访问或Web服务访问.为了澄清,如果我可以将LINQ"WHERE/ORDER BY"谓词转换为SQL"WHERE/ORDER BY"子句,那么......
    • Dapper可以直接使用SQL字符串.
    • 与LINQ表达式不同,SQL字符串可以发送到WCF服务以用于直接数据库访问(它本身可能不使用Dapper).
    • 可以使用自定义代码将SQL字符串反序列化,由WCF服务返回到LINQ语句中. Eric Lippert就此发表评论.
  • UI可以使用IQueryable机制动态生成谓词以提供给存储库

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

Ale*_*lex 1

这是我不久前简单研究过的事情。您可能需要查看http://iqtoolkit.codeplex.com/和/或http://expressiontree.codeplex.com/以获取想法。正如其他人所提到的,如果您不将范围限制为真正需要的最小功能集,那么 Linq 查询提供程序的构建绝非易事。

如果您的目标与根据 DDD 的存储库的“规范”或“查询对象”概念相关,那么这可能不是最好的方向。与技术相关抽象之类的 CRUD 不同,专注于领域行为的表达方式可能会更有成效,同时尽量减少对技术相关抽象的直接依赖。正如 Eric Evans 最近讨论的那样,他对在最初的 DDD 描述中对技术构建块(例如存储库)的关注感到遗憾。