Bre*_*ias 12 .net c# sql linq expression-trees
LINQ to SQL或LINQ to Entities已经能够将LINQ转换为SQL文本字符串.但是我希望我的应用程序在不使用db上下文的情况下进行转换 - 这反过来意味着一个活动的数据库连接 - 这两个提供者都需要.
我想将LINQ表达式转换为等效的SQL字符串for WHERE和ORDER 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方法中输入的谓词具有智能感知和基本编译时检查.简而言之,这样的工具有助于根据DDD实现存储库的"规范"或"查询对象"概念,并且不依赖于EF或LINQ to SQL.
这是我不久前简单研究过的事情。您可能需要查看http://iqtoolkit.codeplex.com/和/或http://expressiontree.codeplex.com/以获取想法。正如其他人所提到的,如果您不将范围限制为真正需要的最小功能集,那么 Linq 查询提供程序的构建绝非易事。
如果您的目标与根据 DDD 的存储库的“规范”或“查询对象”概念相关,那么这可能不是最好的方向。与技术相关抽象之类的 CRUD 不同,专注于领域行为的表达方式可能会更有成效,同时尽量减少对技术相关抽象的直接依赖。正如 Eric Evans 最近讨论的那样,他对在最初的 DDD 描述中对技术构建块(例如存储库)的关注感到遗憾。