我可以在 LINQ 查询中使用扩展方法吗?

2024-03-29

我有以下代码:

    public QuestionDetail GetQuestionDetail(int questionId)
    {
        Question question = _questionsRepository.GetById(questionId);
        QuestionDetail questionDetail = new QuestionDetail()
        {
            QuestionId = questionId,
            Text = question.Text.FormatCode()
        };
        return questionDetail;
    }

我将其替换为:

    public QuestionDetail GetQuestionDetail(int questionId)
    {
        var questions = _questionsRepository
            .GetAll()
            .Include(q => q.Answers)
            .Select(m => new QuestionDetail
            {
                QuestionId = m.QuestionId,
                Text = m.Text.FormatCode()
            })
            .FirstOrDefault();

        return questions;
    }

现在我收到以下错误消息:

LINQ to Entities does not recognize the method 'System.String FormatCode(System.String)' 
method, and this method cannot be translated into a store expression.

这是我的 FormatCode()

public static class CodeDisplay {

    public static string FormatCode(this string content)
    {
        var data1 = content
            .Split(new[] { "<pre>", "</pre>" }, StringSplitOptions.None);
        var data2 = data1
            .Select((s, index) =>
            {
                string s1 = index % 2 == 1 ? string.Format("{0}{2}{1}",
                    "<table class='code'>", "</table>", SplitJoin(s)) : s;
                return s1;
            });
        var data3 = data2.Where(s => !string.IsNullOrEmpty(s));
        var data4 = string.Join("\n", data3);
        return data4;
    }

    private static string SplitJoin(string content)
    {
        IEnumerable<String> code =
            content.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)
                .Select((line, index) =>
                    string.Format("<tr><td>{0}</td><td><pre><code>{1}</code></pre></td></tr>\n",
                    (index + 1).ToString("D2"), HttpUtility.HtmlEncode(line)));
        return string.Join("", code) + "\n";
    }


}

简短回答:是的,您可以在 LINQ 查询中使用自定义扩展方法 - 但不能使用底层数据提供程序不知道如何执行的扩展方法。

LINQ 代表语言集成查询,是 C# 中的一项语言功能。您可以在 LINQ 查询中使用任何 .NET 方法。 LINQ 本身不了解底层数据存储,其详细信息通过以下方式公开给 LINQ:IEnumerable<T> or IQueryable<T>接口。当您查询实现的对象时IQueryable<T>,例如实体框架表,该接口公开底层 LINQ 提供程序,该提供程序了解实体框架/SQL 中的查询。

在查询中使用任何方法时,.NET 方法必须转换为基础数据提供程序才能正常工作。对于 LINQ 到对象(不涉及数据库),这种转换很简单(即不需要转换),因此您可以使用任何扩展方法。对于 LINQ-to-SQL 或 LINQ-to-Entities(如您所使用的),底层数据提供程序必须知道如何将 CLR 方法转换为底层存储中的表示形式,例如 SQL。这是 LINQ 提供者的工作。

因此,您不能在 LINQ-to-Entities 查询中使用自定义扩展方法。为此,LINQ 提供程序需要知道如何在 SQL 中表示您的方法,但它并不知道这一点。

无论如何,实现此目的的一种常见方法是通过调用急切方法之一在底层数据提供程序中执行查询,例如ToArray() or ToList(),然后使用您的自定义方法进一步细化查询。由于结果是简单的 CLR 对象,因此使用 LINQ-to-Objects,并且您可以使用自定义 CLR 方法。请注意,这可能会从数据库中获取许多结果。对于您的示例,您只获取一个结果,因此这并不重要。

将上述模式应用到您的代码中将如下所示:

public QuestionDetail GetQuestionDetail(int questionId)
{
    var questions = _questionsRepository
        .GetAll()
        .Include(q => q.Answers)
        .Take(1)   // Constrain to one result fetched from DB
        .ToArray() // Invoke query in DB
        .Select(m => new QuestionDetail
        {
            QuestionId = m.QuestionId,
            Text = m.Text.FormatCode()
        })
        .FirstOrDefault();

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

我可以在 LINQ 查询中使用扩展方法吗? 的相关文章

随机推荐

  • SourceTree 将拉取的文件视为未提交的更改

    在某些未知的情况下 当我使用 SourceTree 拉取时 它会将所有拉取的文件视为未提交的更改 并且不允许再拉 推 除非重新提交或放弃这些更改 如果我丢弃未提交的文件 它将丢弃我的队友应用的所有更改 这有什么问题吗 是否存在已知的错误或其
  • graph6 格式如何工作?

    我一直在到处寻找 g6 或 graph6 格式的工作原理 但我不知道它是如何工作的 我发誓它就像魔法一样 F B w 这是一个以 ASCII 形式表示的图表 它可以由 Wolfram Mathematica Sage 和 Maple 等进行
  • Angular 错误:PostCSS 收到未定义而不是 CSS 字符串

    尝试构建 Angular 项目 但出现以下错误 这个项目上周建得很好 我对使用此项目中的 Dll 的其他项目进行了一些更改 但没有对此项目进行任何更改 我已经花了很多时间来排除故障 但没有运气 感谢任何帮助 错误 PostCSS 收到未定义
  • Facebook SDK 和通过 ShareDialog 问题共享 Play 商店应用程序链接

    我正在尝试使用 Facebook SDK 中的 ShareDialog 共享链接 我的 Google Play 应用程序链接 但问题是 当 URL 是我的应用程序的 Google Play 链接时 其他信息无法正确显示 实际上它只显示链接来
  • 如何让shell脚本在Mac中双击运行?

    我创建了一个 shell 脚本来在 Mac 中运行 jar 文件 bin sh java Xmx512m jar test jar 我已将此脚本重命名为 应用程序命令 双击就可以直接运行 我已经应用了 chmod x 命令使其具有可执行权限
  • PHP header() 不会重定向问题

    我的 header Location index php action messagesent 有问题 在用户按下提交并且 php 运行后 它不会重定向 通常它会重定向 但由于某种原因它不起作用 它只是在点击提交后重新加载页面 但它确实在标
  • 如何删除联系人?

    我正在使用 android 2 1 ContactContract 当我没有将帐户 例如 gmail 帐户 设置为 android 模拟器时 新建一个联系人 但无法在数据库中删除该联系人 ArrayList
  • 添加包含订单计数的列

    如何向数据框中添加一列来说明另一列中某个值出现的顺序计数 这就是我想要的结果 Fruit orderCount 1 Orange 1 2 Banana 1 3 Orange 2 4 Apple 1 5 Orange 3 6 Banana 2
  • 将文本渲染到 kivy 画布

    我正在尝试在奇异的 画布 中绘制自己的图形 现在我有一个红色或绿色的矩形 每秒改变一次颜色 但我想添加一个变化的文本标签 经过一番搜索后 似乎没有可以添加到画布的 文本 指令 我发现了一些关于使用 Label 小部件以及画布说明的参考 但这
  • 有没有替代 imread 命令来减少 matlab 程序中的延迟?

    我在此路径 G newdatabase 中有 2900 个图像 读取图像花费了太多时间 对于点积 它也花费了太多时间 问题 1 是否有任何替代 imread 命令来提高性能 2 是否有任何替代点命令可以提高性能 我尝试过的源代码 srcFi
  • 为什么windows第一次打开文件那么慢,有没有更快的方法

    这是 Windows 7 64 位 专业版使用 考虑一个非常简单的循环 for i 0 i lt names gt size i std string Name names gt at i HANDLE fileHandle CreateF
  • 使用 MAMP 在 Mac 上出现“db: SQLSTATE[HY000] [2002] 连接被拒绝”错误

    我正在尝试运行此 PHP 数据库的 CLI 版本搜索和替换脚本 https github com interconnectit Search Replace DB 但我认为这是一个与 Mac OS X 和 MAMP 相关的更常见的 MySQ
  • 如何使用 Errai 将 GWT 与 JAX-RS/RESTEasy 服务器集成?

    我想从 GWT 客户端应用程序调用使用 RESTEasy 和 JAX RS 创建的 REST 服务 使用 Errai 为服务器和客户端使用单一代码库的最佳流程是什么 我们都喜欢休息 它与供应商 平台和语言无关 调试 实施和访问都很简单 它为
  • Spring和hibernate:没有找到当前线程的会话

    我收到以下错误 org hibernate HibernateException No Session found for current thread at org springframework orm hibernate4 Sprin
  • 连接两个表后的 SQL 更新

    我是 SQL 新手 正在使用 Microsoft SQL Server Management Studio 我正在尝试编写一个 SQL 语句 在连接两个表后执行更新 我有两张桌子 myTable1 and myTable2 两者共享一个领域
  • CSS 不透明度如何影响可访问性?

    在浏览了一些谷歌和其他 SO 文章后 我决定简单地提出我的问题 希望得到一个简单 直接的答案 为讨论添加进一步的步骤opacity 0 与visibility hidden 的效果完全相同吗 https stackoverflow com
  • Flex ModuleLoader 组件导致内存泄漏。如何正确卸载模块?

    该应用程序太大 无法在此描述 但我可以告诉您 我有多达 20 个或更多模块可供客户端随时使用 如果我继续加载一个又一个屏幕 我的应用程序可能会占用 500MB 甚至更多 我用来加载和卸载模块的脚本是 public function crea
  • 静态函数中不可访问非静态成员

    我定义了一个函数 HRESULT AMEPreviewHandler CreateHtmlPreview ULONG CbRead const int Size 115000 char Buffer Size 1 HRESULT hr m
  • 检测其他 UIView 中是否触摸了某个 UIView

    我有 3 个 UIView 分层在一个大 uiview 之上 我想知道用户是否触摸了最上面的一个而不关心其他的 我将在第二个 UIView 中有几个按钮 在第三个 UIView 中有一个 UITable 问题是我在第一个视图上打开 user
  • 我可以在 LINQ 查询中使用扩展方法吗?

    我有以下代码 public QuestionDetail GetQuestionDetail int questionId Question question questionsRepository GetById questionId Q