- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用带有 Linq to Entities 的 Entity Framework ,试图从我的数据库中选择一些数据。当我创建一个使用方法 IQueryable<int>.Contains
的 Linq 查询时,如果我使用外部变量,它只能过滤数据!让我举个例子。
这段代码完美运行:
var volumes = (from v in work.VolumeAdditiveRepository.All
where v.AdditivesID == AdditivesID
select v.MetricID);
var metrics =
from m in work.MetricRepository.All
where !volumes.Contains(m.ID)
select m;
如果仔细观察,您会发现我在这段代码中使用了变量 volumes
,在 where
条件下。如果我复制此变量的内容并将其粘贴到 metrics
变量中,导致下面的代码,它会引发错误:"Unable to create a constant value of type 'CalculadoraRFS.Models.Domain.VolumeAditivo'. Only primitive types ('such as Int32, String, and Guid') are supported in this context."
。
var metrics =
from m in work.MetricRepository.All
where !(from v in work.VolumeAdditiveRepository.All
where v.AdditivesID == AdditivesID
select v.MetricID).Contains(m.ID)
select m;
变量替换怎么会导致这样的错误?!我(肯定)做错了什么吗?
谢谢!
更新:
实际上,正如@jhamm 指出的那样,我发现 Repository Pattern 或 DbContext 似乎是问题所在。下面的代码片段也不起作用:
var query = from m in work._context.Metric
where !(from v in work._context.VolumeAdditive
where v.AdditivesID == AdditivesID
select v.MetricID).Contains(m.ID)
select m;
但下面的代码片段有效。我只是从 UnitOfWork 类中取出上下文,尽管它在那里的定义非常简单:public CalculadoraRFSContext _context = new CalculadoraRFSContext();
。
var _context = new CalculadoraRFSContext();
var query = from m in _context.Metric
where !(from v in _context.VolumeAdditive
where v.AdditivesID == AdditivesID
select v.MetricID).Contains(m.ID)
select m;
现在我对这些东西真的很困惑!它不是应该按预期工作吗?!
最佳答案
我用了LINQPad在类似类型的查询中使用我的 EF Database First 模型。组合查询和单独查询都给出了相同的正确结果并生成了相同的 SQL。这是有关如何 use LINQPad with Entity Framework 的链接.一个区别可能是存储库模式的使用,我没有使用它。我建议使用第一个查询进行测试以查看生成的 SQL。运行查询后,LINQPad 有一个 SQL 选项卡,可以通过查看生成的 SQL 来帮助解决正在发生的问题。
如果您仍然无法使用组合的 LINQ 语句,下一步最好是尝试不使用存储库对象的 Entity Framework 对象。如果此查询有效,则您的 Repository 对象可能有问题。
// Guessing that Metric and VolumeAdditive are the EF Entities
// LINQPad database dropdown sets the context so they were not set it in these samples
var metrics =
from m in Metric
where !(from v in VolumeAdditive
where v.AdditivesID == AdditivesID
select v.MetricID).Contains(m.ID)
select m;
为了找出问题所在,接下来我将使用 MetricRepository 和 VolumeAdditive EF 对象。
var metrics =
from m in work.MetricRepository.All
where !(from v in VolumeAdditive
where v.AdditivesID == AdditivesID
select v.MetricID).Contains(m.ID)
select m;
然后我会将它们切换为使用带有 VolumeAdditiveRepository 的 Metric EF 对象。
var metrics =
from m in Metric
where !(from v in work.VolumeAdditiveRepository.All
where v.AdditivesID == AdditivesID
select v.MetricID).Contains(m.ID)
select m;
根据生成的 SQL 和哪些查询有效,我认为这应该可以帮助您指明正确的方向。这是基于消除问题的一部分直到它起作用。然后将它们重新添加,直到它们断开以指示问题所在。这些步骤应该使用小的增量更改来完成,以最大限度地减少问题空间。
更新:
根据新信息,我们尝试将新信息分解为我们需要回答的新问题。
也许 LINQ 表达式无法确定如何处理 where 子句中的 work._context.VolumeAdditive
。因此,让我们使用以下内容来测试该理论。这会将上下文设置为单个变量,而不是使用 work._context。
var _context = work._context;
var query = from m in _context.Metric
where !(from v in _context.VolumeAdditive
where v.AdditivesID == AdditivesID
select v.MetricID).Contains(m.ID)
select m;
也许使用 let 语句来定义 MetricID 可以解决这个问题。
var metrics =
from m in work.MetricRepository.All
let volumes = from v in work.VolumeAdditiveRepository.All
where v.AdditivesID == AdditivesID
select v.MetricID
where !volumes.Contains(m.ID)
select m;
根据这些测试的结果以及混合和匹配前 3 个测试/问题,我们应该会更接近答案。当我遇到这样的问题时,我会尝试用可验证的答案来问自己问题。基本上,我尝试使用科学方法缩小问题范围以找到解决方案。
关于c# - 带有 Contains 的 Linq 查询仅适用于 IQueryable 位于外部变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7675791/
如何指示 webpack 排除所有 d3 模块? // does not work externals: { "d3-*": "d3" } 所以如果应用导入了d3-submod
这个问题在这里已经有了答案: 9年前关闭。 Possible Duplicate: What does “outer =>” really mean? 我在哪里可以找到有关信息 trait After
这是一个简单的循环,我正在尝试对性能进行基准测试。 var extremeLoop=function(n){ var time=new Date() var t=0; for(
问题+概述 下面是两个片段,其中包含最初隐藏的 div,然后通过单击 button 和 jQuery 的 .show() 显示。两个 div 都具有由外部样式表应用的 display: grid; 样
我有一个 HTML 页面和一个单独的 .js 文件,该文件包含在带有 的页面中标签。 这是我的 .js 文件: element = document.getElementById("test");
我在 linux 静态库项目中有 3 个文件,我想在两个类方法实现文件中使用的静态字段存在链接问题。我有 class1.h、class1main.cpp 和 class1utils.cpp。 clas
我正在尝试将颜色背景更改为默认背景颜色,当我点击输入框外 我尝试使用“null”或“none”但没有用? window.addEventListener('click', outsideClick);
我正在编写一个应用程序,要求用户在手机上选择各种类型的文件。我使用此代码启动文件选择器 Intent : Intent intent = new Intent(Intent.ACTION_GET_C
在 android 中,不可移动(内部)的外部存储和内部存储有什么区别?我不确定在哪里保存我的数据。我只需要保存一个人可以随时提取的游戏统计数据 谢谢 最佳答案 在许多较新的设备中,将不再有物理区别,
在 C++ 中,假设我们有这个头文件: myglobals.h #ifndef my_globals_h #define my_globals_h int monthsInYear = 12; #en
我正在尝试使用 externs 在 C++ 中连接到 Ada。这两种实现有什么区别? 实现A namespace Ada { extern "C" { int getN
这个问题在这里已经有了答案: Get selected element's outer HTML (30 个答案) 关闭 2 年前。 想象一下我们有这样的东西: Hello World 如果我们这样
假设我在模块的顶部有这个: Public Declare Function getCustomerDetails Lib "CustomerFunctions" () As Long 如果我从 VB6
我目前正在使用这段代码: var wordRandomizer = { run: function (targetElem) { var markup = this.creat
我们正在使用 SVN 试水,并以 Beanstalk 作为主机。我们的设置如下所示: 存储库:模块 模块一 模块二 模块 3 存储库:网站1 自定义网站代码 svn:对模块 1 的外部引用 svn:对
有没有办法在负载均衡器中设置自动外部 IP 分配给像谷歌这样的服务? 我在裸机上运行 Kubernetes。 谢谢 最佳答案 使用 nodePort 类型的服务,它会将您的服务绑定(bind)到所有节
是否有可能在 Controller 之外使用 generateUrl() 方法? 我尝试在带有 $this->get('router') 的自定义存储库类中使用它,但它没有用。 更新 我在这里找到了一
我目前正在尝试通过 Webpack 外部对象外部化 Angular 依赖项来缩短构建时间。到目前为止,我已经为 React 和其他小库实现了这一目标。 如果我只是移动 '@angular/compil
我想创建一个自动应用其他插件的插件(外部插件)。这要求在我称为“应用插件”之前为插件设置构建脚本依赖项。但是似乎我无法在插件中添加buildscript依赖项,或者得到了: 您不能更改处于未解析状态的
我是R包的创建者EnvStats . 有一个我经常使用的函数,叫做 stripChart .我刚开始学习ggplot2 ,并在过去几天里仔细研究了 Hadley 的书、Winston 的书、Stack
我是一名优秀的程序员,十分优秀!