我正在使用linq2db
它,虽然它对于大多数 CRUD 操作都足够好,但我遇到了许多无法转换为 SQL 的表达式。
它已经到了这样的地步,除非我事先确切知道将涉及哪些类型的表达式并且之前已经成功调用过它们,否则我担心从中获得的任何好处linq2db
都会被尝试查找然后删除(或远离服务器端)有问题的表达式。
如果我知道如何在临时、按需的基础上告诉linq2db
如何将一个或诸如此类的东西解析为 SQL,那么我会更有信心,并且可以使用这个工具做很多事情。Expression<Func<T,out T>>
以 为例,String.Split(char separator)
该方法采用 astring
和 achar
来返回string[]
分隔符之间的每个子字符串的 a。
假设我的表Equipment
有一个可以为空的varchar
字段Usages
,其中包含用逗号分隔的不同设备用途的列表。
我需要实现IList<string> GetUsages(string tenantCode, string needle = null)
这将提供给定租户代码和可选搜索字符串的用法列表。
我的查询将类似于:
var listOfListOfStringUsages =
from et in MyConnection.GetTable<EquipmentTenant>()
join e in MyConnection.GetTable<Equipment>() on et.EquipmentId = e.EquipmentId
where (et.TenantCode == tenantCode)
where (e.Usages != null)
select e.Usages.Split(','); // cannot convert to sql here
var flattenedListOfStringUsages =
listOfListOfStringUsages.SelectMany(strsToAdd => strsToAdd)
.Select(str => str.Trim())
.Distinct();
var list = flattenedListOfStringUsages.ToList();
但是,它实际上会在运行时在注释指示的行上爆炸。
我完全明白,linq2db
不可能期望它的创建者附带string
方法和主要数据库包的每种组合。
同时,我觉得如果我能看到一个这样做的例子(有人实现自定义表达式),我就可以完全告诉它如何处理这个问题。
所以我的问题是:我如何指导linq2db
如何解析Expression
它无法解析的开箱即用?