在 LINQ to Entities 中使用 GLOB 函数

2023-12-01

我需要 SQLiteglob(C#) 方法中必须返回的函数Expression<Func<RandomEntity, bool>>——我需要glob因为只有这样才使用索引(已经使用检查过EXPLAIN QUERY PLAN [..]).

所以我添加了以下函数映射到<edmx:StorageModels><Schema> (SSDL):

    <Function Name="glob" Aggregate="false" BuiltIn="true" NiladicFunction="false" IsComposable="true" ReturnType="bit">
        <Parameter Name="pattern" Mode="In" Type="nvarchar"/>
        <Parameter Name="target" Mode="In" Type="nvarchar"/>
    </Function>

和一个 C# 存根方法:

public static class SQLiteFunctions
{
    [DbFunction("Model.Store", "glob")]
    public static bool Glob(string pattern, string target)
    {
        throw new NotImplementedException("Only exists for IQueryable/Expression<Func<T,bool>>!");
    }
}

以及用法(只是一个生成微小 SQL 的示例):

var count = context.Users.Count(u => SQLiteFunctions.Glob("admin*", u.Name));

虽然这有效,但生成的 SQL 使用了“愚蠢的”= 1比较,因为模型只知道数据类型“位”(即 0 或 1),并且我发现没有真正的布尔类型,尽管本机 glob 函数似乎是真正的布尔类型:

SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    Count([Filter1].[A1]) AS [A1]
    FROM ( SELECT 
        1 AS [A1]
        FROM [Users] AS [Extent1]
        WHERE (glob('admin*', [Extent1].[Name])) = 1
    )  AS [Filter1]
)  AS [GroupBy1]

问题:这样(使用“= 1”)SQLite不使用索引,查询速度非常慢。如果我删除 3 个字符“= 1”,查询会变得更快,并且查询计划也会从“SCAN TABLE”更改为“SEARCH TABLE USING INDEX”。

有什么想法如何使该函数成为真正的布尔函数吗?


添加:

我还尝试使用 CSDL 部分 ():

    <Function Name="GlobMatch" ReturnType="Edm.Boolean">
        <Parameter Name="globPattern" Type="Edm.String" />
        <Parameter Name="target" Type="Edm.String" />
        <DefiningExpression> glob(globPattern, target) </DefiningExpression>
    </Function>

and

    [DbFunction("DoPiMo", "GlobMatch")]
    public static bool Glob2(string globPattern, string target)
    {
        throw new NotImplementedException("Only exists for IQueryable/Expression<Func<T,bool>>!");
    }

但这只会产生一个运行时错误,指出“glob”未定义/已知。


当使用 LIKE 或 GLOB 进行前缀搜索时,SQLite 将其重写为两个比较。

你可以直接写两个比较:

u.Name >= "admin" and u.Name < "admio"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 LINQ to Entities 中使用 GLOB 函数 的相关文章

随机推荐

  • for循环中的索引变量(_i)?

    看一下这个简单的代码 eat x gt console log nom x dog only eats every second cat feast cats gt eat cat for cat in cats when i 2 0 fe
  • 使用鼠标绘制平移图 - Jfreechart

    Can we implement the pan functionality as a mouse drag event in JfreeChart Right now I press CTRL and drag my mouse to p
  • 在 R 中创建等和的组

    我试图将 data frame data table 的一列分为三组 所有组的总和相等 数据首先按照从最小到最大的顺序排列 这样第一组将由大量具有较小值的行组成 而第三组将由少量具有较大值的行组成 这是通过以下方式实现的 test lt d
  • 如何在 SQL 中将换行符转换为 BR 后保存 Textarea 输入

    我在管理面板中使用 ckeditor 但在用户提交表单中使用简单的文本框 以便用户可以输入文本并提交 问题是 当用户在带有换行符的文本区域中输入文本时 它会保存为 SQL 中的文本 我想在sql的每一行后面添加BR 例如用户提交 F R I
  • R 跳过 /dev/stdin 中的行

    我有一个包含数字列表的文件 自己制作 for x in seq 10000 do echo x done gt file gt R q e x lt read csv file header F summary x gt x lt read
  • 想要:不受 AbandonedMutexException 影响的跨进程同步

    我有几个线程获取互斥体然后终止 互斥体存储在主存储库中 并在程序存在时正确释放 但是 当分配互斥锁的线程存在时 该互斥锁会自动释放 并随后获取 AbandonedMutexException 也根据文档 如何避免此异常 并在分配线程完成后继
  • 摘要 {Hmisc} 删除类别?

    我正在尝试获取包含百分比的交叉表这个文件 using Hmisc 但为什么是summary 从变量 OCCUPATION 中删除类别 其他 library Hmisc summary ID OCCUPATION data df method
  • 如何在管理中的文本区域上默认启用所见即所得?

    如何在文本区域上默认启用所见即所得 我的意思是 我不想单击所见即所得按钮来显示带有tinyMCE的区域 我直接想要这个 经过一番研究后我发现了它 1 将此代码放入您希望编辑器直接显示的 phtml文件中 2 在代码第6行可以看到elemen
  • 为什么 autoload 无法加载 gems 文件

    我正在尝试使用这个在 ruby 中阅读电子邮件Gmail 宝石 When I require gmail 在 IRB 或脚本中 我收到此错误 Library Ruby Gems 1 8 gems gmail 0 4 0 lib gmail
  • 绑定和样式不适用于Win8?

    我从 TextBox 派生并将其命名为 MyTextBox 在我的 LayoutAwarePage 上 我创建了 2 个 SolidColorBrush 道具 MyBackground 和 MyBorder 在该页面的 Xaml 中 我编写
  • 为什么 kubelet 运行在 kubernetes 主节点上?

    我已经使用 kubeadm 在本地笔记本电脑上部署了一个 kubernetes 集群 1 个主节点和 2 个工作节点 请注意 kubelet 也在主节点上运行 从我之前读过的文章来看 只有工作节点上才需要 kubelet 有人可以告诉我为什
  • perl - 用另一个字符替换每第 n 次(和多次)出现的字符

    有谁知道任何unix命令 perl脚本会在特定字符第n次重复出现的位置插入特定字符 可以作为十六进制 即7C 或实际字符 即 输入 IEperl script pl 3 data txt将用管道替换每个第 3 个 第 6 个 第 9 个 等
  • 自动更新 Ruby on Rails 中的created_by 和updated_by 值

    我正在尝试添加当前的user id into a created by and updated by自动字段 谁能帮我 这是数据架构 create table businesses force cascade do t t string b
  • 如何将依赖项包含到 EAR 中,文件名中不包含版本

    我正在创造 ear使用行家
  • 当选择多个项目时如何清除QListView的选择?

    我正在开发一个 Qt 应用程序 其中有一个 QListView 列表中的项目很少 我的应用程序需要根据用户的选择重新排列项目 一切工作正常 但我面临一个小问题 当我使用鼠标进行多重选择时 即通过拖动鼠标选择项目时 即使我做了一些重新排列操作
  • 结果的 var_dump 给出空值。但更深入的检查返回一个整数[重复]

    这个问题在这里已经有答案了 可能的重复 新的 Mysqli 对象为 Null 我刚刚开始为 MVC 框架构建数据库类 在构建这个时 我正在尝试简单的查询和表 以使其正常工作 我试图查询以下内容 从 mvc test 选择 这应该返回 3 行
  • HTML5 页脚 - 我无法删除的边距

    我已经创建了一个基于 HTML 5 Boilerplate 的网站 我想要一个基本上全白色的网站 但页脚的背景为灰色 问题是页脚下方有一个边距 并且很确定它是一个边距 而不是填充或白色边框 在我的灰色页脚下方留下了一条白色条带 为了在此处发
  • 两个线程可以同时读取同一个QList吗?

    对于线程来说相当陌生 我有一个线程在它们之间共享的 QList 它们都有自己可以工作的空间 并且 GUI 模型 视图 不断访问该列表 然后我得到了指向 QDataList size 的崩溃 调试并没有真正帮助我 因为如果我单步执行代码 并且
  • 如何在 Spring MVC 中正确配置 Stomp 和 SockJS 端点?

    这是 可能是以下内容的重复 Websocket InvalidStateError 连接尚未建立 我正在实施通知系统 并希望在用户登录时初始化套接字连接 并向他显示他的通知 以及如果发生某些事件 我的代码片段如下 websocket js
  • 在 LINQ to Entities 中使用 GLOB 函数

    我需要 SQLiteglob C 方法中必须返回的函数Expression