将带有查找的循环展平为单个 linq 表达式

2023-12-14

In LINQ-to-Entities 中的类型成员支持?我试图声明一个要在 LINQ 中查询的类属性,但遇到了一些问题。在这里,我将列出实现中的代码,希望对将其转换为查询有所帮助。

我有课Quiz其中包含一个集合Questions,其中每一个都根据QuestionLevel...我需要确定测验是“开放”还是“封闭”,这是通过问题级别的外连接以及每个级别中的问题计数(与最大值表相比)来完成的。这是逐字的代码:

public partial class Quiz
{
    public bool IsClosed
    {
        get
        {
            // if quiz has no questions, it's open
            if (this.Questions.Count() == 0) return false;

            // get a new handle to the EF container to do a query for max values
            using (EFContainer db = new EFContainer())
            {
                // we get a dictionary of LevelName/number
                Dictionary<string, int> max = db.Registry
                    .Where(x => x.Domain == "Quiz")
                    .ToDictionary(x => x.Key, x => Convert.ToInt32(x.Value));
                // count the number of questions in each level, comparing to the maxima
                // if any of them are less, the quiz is "open"
                foreach (QuestionLevel ql in db.QuestionLevels)
                {
                    if (this.Questions.Where(x => x.Level == ql).Count() < max["Q:Max:" + ql.Name])
                        return false;
                }
            }
            // the quiz is closed
            return true;
        }
    }
 }

所以这是我尚未进行的尝试:

    public static IQueryable<Quiz> WhereIsOpen(this IQueryable<Quiz> query)
    {
        EFContainer db = new EFContainer();
        return from ql in db.QuestionLevels
               join q in query on ql equals q.Questions.Select(x => x.Level)
               into qs
               from q in qs.DefaultIfEmpty()
               where q.Questions.Count() < db.Registry
                    .Where(x => x.Domain == "Quiz")
                    .Where(x => x.Key == "Q:Max" + ql.Name)
                    .Select(x => Convert.ToInt32(x.Value))
               select q;
    }

它在加入时失败,抱怨:

join 子句中的表达式之一的类型不正确。 调用“GroupJoin”时类型推断失败

我还在想办法解决这个问题。

*更新我*

啊。愚蠢的我。

   join q in query on ql equals q.Questions.Select(x => x.Level).Single()

又一个障碍:

指定的 LINQ 表达式包含对以下查询的引用 与不同的上下文相关。

这是因为我为最大查找次数创建了新容器;所以我想像这样重新考虑:

    public static IQueryable<Quiz> WhereIsOpen(this IQueryable<Quiz> query)
    {
        EFContainer db = new EFContainer();
        IEnumerable<QuestionLevel> QuestionLevels = db.QuestionLevels.ToList();
        Dictionary<string, int> max = db.Registry
                .Where(x => x.Domain == "Quiz")
                .ToDictionary(x => x.Key, x => Convert.ToInt32(x.Value));
        return from ql in QuestionLevels
               join q in query on ql equals q.Questions.Select(x => x.Level).Single()
               into qs
               from q in qs.DefaultIfEmpty()
               where q.Questions.Count() < max["Q:Max:" + ql.Name]
               select q;
    }

但我无法编译表达式...它需要我将 QuestionLevels 转换为 IQueryable (但转换不起作用,会产生运行时异常)。

*更新二*

我找到了铸造问题的解决方案,但现在我又回到了“不同上下文”异常。呃……

return from ql in QuestionLevels.AsQueryable()

*更新(柯克的建议)*

所以我现在有了这个,它可以编译但会生成运行时异常:

public static IQueryable<Quiz> WhereIsOpen(this IQueryable<Quiz> query)
{
    EFContainer db = new EFContainer();
    IEnumerable<string> QuestionLevels = db.QuestionLevels.Select(x => x.Name).ToList();
    Dictionary<string, int> max = db.Registry
            .Where(x => x.Domain == "Quiz")
            .ToDictionary(x => x.Key, x => Convert.ToInt32(x.Value));
    return from ql in QuestionLevels.AsQueryable()
           join q in query on ql equals q.Questions.Select(x => x.Level.Name).Single()
           into qs
           from q in qs.DefaultIfEmpty()
           where q.Questions.Count() < max["Q:Max:" + ql]
           select q;
}

然后我这样称呼它:

List<Product> p = db.Quizes.WhereIsOpen().Select(x => x.Component.Product).ToList();

结果异常:

此方法支持 LINQ to Entities 基础结构,但不支持 旨在直接从您的代码中使用。


当您将数据库对象耦合到域对象时,您遇到的问题很常见。正是由于这个原因,最好有一组单独的类来代表您的域,以及一组单独的类来代表您的数据库并用于数据库 CRUD。属性重叠是可以预料的,但这种方法提供了对应用程序的更多控制,并将数据库与业务逻辑分离。

测验结束的想法属于您的领域(业务逻辑)。您的 DAL(数据访问层)应负责连接所有必要的表,以便当您返回测验时,可以使用确定测验是否关闭所需的所有信息。然后,您的域/服务/业务层应该使用以下内容创建域对象IsClosed属性已正确填充,以便在 UI 层 (MVC) 中您可以轻松访问它。

我看到您直接访问数据库上下文,我对此提出警告并鼓励您研究使用 DI/IoC 框架(Ninject 很棒),但是,我也将直接访问数据库上下文

在您的视图/控制器中使用此类:

public class QuizDomainObject 
{
    public int Id {get; set;}
    public bool IsClosed {get; set;}
    // all other properties
}

控制器:

public class QuizController : Controller 
{
    public ActionResult View(int id)
    {
        // using a DI/IoC container is the 
        // preferred method instead of 
        // manually creating a service
        var quizService = new QuizService(); 
        QuizDomainObject quiz = quizService.GetQuiz(id);

        return View(quiz);
    }
}

服务/业务层:

public class QuizService
{
    public QuizDomainObject GetQuiz(int id)
    {
        // using a DI/IoC container is the 
        // preferred method instead of 
        // access the datacontext directly
        using (EFContainer db = new EFContainer())
        {
            Dictionary<string, int> max = db.Registry
                .Where(x => x.Domain == "Quiz")
                .ToDictionary(x => x.Key, x => Convert.ToInt32(x.Value));

            var quiz = from q in db.Quizes
                       where q.Id equals id
                       select new QuizDomainObject()
                       {
                            Id = q.Id,
                            // all other propeties,

                            // I'm still unclear about the structure of your  
                            // database and how it interlates, you'll need 
                            // to figure out the query correctly here
                            IsClosed =  from q in ....
                       };


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

将带有查找的循环展平为单个 linq 表达式 的相关文章

  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • 将 2 个 Int 列表相加 F#

    我正在做作业 问题是我们得到 2 个相同大小的 int 列表 然后将数字加在一起 示例如下 vecadd 1 2 3 4 5 6 would return 5 7 9 我对此很陌生 我需要保持我的代码非常简单 以便我可以从中学习 到目前为止
  • 如何从Kohana 3.2升级到3.3(实现PSR-0)?

    对于 PSR 0 的实施 我需要采取哪些步骤从 Kohana 3 2 升级到 3 3 以及必须从命令行执行哪些命令 Unix 命令行 这些是我在 Kohana 应用程序中实施 PSR 0 所采取的步骤 我删除了以下系统 目录 rm rf s
  • 关于实现网站“存在”的建议?

    理想情况下 我希望找到简单 轻量级的代码 允许连接到我的网站的所有 Web 客户端维护当前在线的其他人的实时状态 我知道 ejabberd 可以做到这一点 但它还可以做很多其他事情 而且我更喜欢较小的代码占用量 这样我就可以自定义并了解其性
  • 添加附加链接到 jquery ui 自动完成列表

    抱歉 我找不到关于如何执行此操作的明确解决方案 我正在使用 jQuery UI 自动完成功能textbox从数据库中检索数据 我需要在列表末尾添加 添加新地点 链接 我希望允许用户添加新的场地 如果他们正在寻找的场地尚未在数据库中 这是我的
  • 在 C# 中包装 COM 对象/动态类型

    我目前正在托管代码中使用 COM 对象 并为此使用新的动态类型 这在某些领域效果很好 但在其他领域可能会出现问题 我在考虑如何才能两全其美 即动态类型 后期绑定 的灵活性以及 RCW 早期绑定 的支持 以某种方式将动态类型包装在更易于管理的
  • 无法使用有效访问密钥从 Uber API 获取令牌

    在过去的几天里 我一直在尝试将我的应用程序与 uber 集成 但由于某些原因 在 oauth2 身份验证期间 我无法让 uber 给我一个有效的令牌 我可以获得访问代码 但是使用curl 时 无论我如何安排脚本 我似乎都无法获得访问令牌 这
  • 适用于 Android 的 Firebase 数据库 - 使用持久性在离线时写入事件

    如标题所述 我正在使用 Firebase 实时数据库 启用持久性 正如指南中所述 通过启用持久性 Firebase 实时数据库客户端在联机时同步的任何数据都会持久保存到磁盘 并且即使在用户或操作系统重新启动应用程序时也可以脱机使用 这意味着
  • ORA-14551: 无法在查询内执行 DML 操作

    我有以下内容package它给了我一个错误 ORA 14551 cannot perform a DML operation inside a query Code is DECLARE CURSOR F IS SELECT ROLE ID
  • 无法使用 NSPopover 禁用背景模糊

    在 10 10 中运行时 我没有运气尝试让 NSPopover 恢复到 10 9 的外观 我有一个弹出窗口 它附加到用户拖动的 NSView 上 弹出窗口must是透明的 这样用户仍然可以看到下面其他 UI 元素的位置 在 10 9 下一切
  • 如何停止在 Netbeans 中启动的 Maven 项目

    我在 NetBeans 中有一个项目 它以一个带有参数的 main 函数开始 当我点击 停止 按钮时 项目继续运行 但不再有输出 目前我必须记住从控制台手动停止该进程 如何修改我的项目 maven 设置或 NetBeans 配置以使进程在我
  • R - 我想遍历一个大矩阵的行并删除所有零

    我在一个非常大的矩阵 184 x 4000 类型 double 中有很多行和列 我想删除所有 0 矩阵中的值通常大于 0 但也有一些行为 0 0000 我尝试使用以下方法删除带零的行 x lt x which rowSums x gt 0
  • 如何使用 Spring Data 调用存储过程来选择实体

    假设我有一个 MySQL 存储过程 其中包含以下选择 select from users 如何使用 Procedure中的注释JpaRepository这样我就能得到结果 就像是 public UserRepository extenda
  • 如何获取触摸时的像素颜色?

    我知道这是一个常见问题 并且这个问题有很多答案 我用过一些这个 虽然很多都是一样的 但对我来说可悲的是 他们都不适合我 我到目前为止使用过以下代码 void getRGBAsFromImage UIImage image atX int x
  • 比较 Objective-C 中的浮点数的奇怪问题

    在算法中的某个时刻 我需要将类的属性的浮点值与浮点进行比较 所以我这样做 if self scroller currentValue lt 0 1 其中 currentValue 是浮点属性 然而 当我拥有平等和self scroller
  • Javascript - 对 div 集合进行排序

    我正在尝试单独学习 Javascript 所以请不要推荐库或 jQuery 我有一个 div 列表 我希望用户能够按它们的值对它们进行排序 例如
  • WPF 多线程进度对话框

    Updated这是我遇到的一个有趣的问题 我需要在后台进程运行时显示进度对话框 通常 这可行 但问题是我需要在后台进程中设置公共静态数据 这是我试图完成的示例 public partial class MainWindow Window p
  • 动态生成多口味配置的包名

    我有 Gradle Android 项目 将供多个客户使用 它还将有免费和付费版本 我意识到它可以通过使用flavorDimensions来实现 但问题是我想要一种根据所选口味生成包名称的方法 flavorDimensions brandi
  • ROW_NUMBER() 的打开 SQL 等效项

    是否有等效的ROW NUMBER ABAP程序的函数 该函数在SQL中的使用如下 SELECT ROW NUMBER OVER ORDER BY SomeField AS Row FROM SomeTable 它应该返回行号作为结果行中的第
  • Weblogic 中的 JSTL 支持

    我尝试使用 Weblogic 开始使用 Java EE 但我无法使 JSTL 标签工作 在最简单的代码中 我在部署应用程序时遇到以下错误 index jsp 1 4 没有标签库可以 通过此 URI 找到 可能的原因 可能是 URI 不正确
  • 将带有查找的循环展平为单个 linq 表达式

    In LINQ to Entities 中的类型成员支持 我试图声明一个要在 LINQ 中查询的类属性 但遇到了一些问题 在这里 我将列出实现中的代码 希望对将其转换为查询有所帮助 我有课Quiz其中包含一个集合Questions 其中每一