LINQ to SQL 或 LINQ to Entities 已经能够将 LINQ 转换为 SQL 文本字符串。但我希望我的应用程序在不使用 db 上下文的情况下进行转换——这反过来意味着一个活动的数据库连接——这两个提供者都需要。
我想将 LINQ 表达式转换为等效的 SQL 字符串 for WHERE
andORDER BY
子句,而不依赖于 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();
}
问题
它主要是我感兴趣的表达式树遍历和转换。有人知道我可以合并以在这种自定义上下文中使用的现有库(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);
但是我的代码和该示例是原始的(并且该示例本身依赖于 LINQ to SQL db 上下文)。例如,两者都不处理“LIKE”语句的生成。
我不期望或不需要处理所有可能的 LINQ 查询的生成器工具。例如,我不担心处理和生成连接或包含。事实上,再过 20 个小时,我自己的自定义代码可能会涵盖我关心的所有情况(主要是“WHERE”和“ORDER BY”语句)。
但同时我觉得我不应该编写自己的自定义代码来做到这一点。如果我坚持自己编写,那么如果有人能指出我可以反映和模仿的特定类(NHibernate、EF 等),我仍然会感兴趣。我问的是要查看的特定类,如果你知道的话,因为我不想花几个小时筛选一个大型工具的代码,只是为了找到我需要的部分。
这并不重要,但如果有人想知道我为什么不简单地使用 LINQ to SQL 或 LINQ to Entities ......对于我的特定应用程序,我只是更喜欢使用诸如Dapper之类的工具。
用例 无论是我自己完成了工具的构建,还是找到了第 3 方库,以下是“LINQ to SQL 文本字符串”有用的原因:
- 我在方法中键入的谓词
IRepository.Find
具有智能感知和基本的编译时检查。 - 我提出的 IStore 接口可以实现用于 DB 访问或 Web 服务访问。澄清一下,如果我可以将 LINQ“WHERE/ORDER BY”谓词转换为 SQL“WHERE/ORDER BY”子句,那么......
- Dapper 可以直接使用 SQL 字符串。
- 与 LINQ 表达式不同,SQL 字符串可以发送到 WCF 服务以用于直接 DB 访问(它本身可能不使用 Dapper)。
- WCF 服务可以使用自定义代码将 SQL 字符串反序列化回 LINQ 语句。 Eric Lippert 对此发表了评论。
- UI 可以使用 IQueryable 机制动态生成谓词以提供给存储库
简而言之,这样的工具有助于根据 DDD 实现存储库的“规范”或“查询对象”概念,并且不会依赖 EF 或 LINQ to SQL。