- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
给定一个 id 列表,我可以通过以下方式查询所有相关行:
context.Table.Where(q => listOfIds.Contains(q.Id));
最佳答案
这是一个令人讨厌的问题,我不知道任何优雅的解决方案。
假设您有这些组合键,而您只想选择带标记的组合键 (*)。
Id1 Id2
--- ---
1 2 *
1 3
1 6
2 2 *
2 3 *
... (many more)
如何做到这一点是 Entity Framework 高兴的一种方式?让我们看看一些可能的解决方案,看看它们是否有任何好处。
Join
(或
Contains
)成对
List<Tuple<int,int>>
)并将数据库数据与此列表连接:
from entity in db.Table // db is a DbContext
join pair in Tuples on new { entity.Id1, entity.Id2 }
equals new { Id1 = pair.Item1, Id2 = pair.Item2 }
select entity
在 LINQ to objects 这将是完美的,但是,太糟糕了,EF 会抛出一个异常
Unable to create a constant value of type 'System.Tuple`2 (...) Only primitive types or enumeration types are supported in this context.
Tuples
不是原始值列表(如
int
或
string
)。1。出于同样的原因,使用
Contains
的类似语句(或任何其他 LINQ 语句)将失败。
from entity in db.Table.AsEnumerable() // fetch db.Table into memory first
join pair Tuples on new { entity.Id1, entity.Id2 }
equals new { Id1 = pair.Item1, Id2 = pair.Item2 }
select entity
不用说,这不是一个好的解决方案。
db.Table
可能包含数百万条记录。
Contains
声明
[1,2]
为
Id1
和
[2,3]
为
Id2
.我们不想使用 join(见附注),所以让我们使用
Contains
:
from entity in db.Table
where ids1.Contains(entity.Id1) && ids2.Contains(entity.Id2)
select entity
但现在结果还包含实体
{1,3}
!嗯,当然,这个实体完美地匹配了两个谓词。但让我们记住,我们越来越近了。不是将数百万个实体拉入内存,我们现在只得到其中的四个。
Contains
计算值
Contains
语句不仅过滤其值的组合。如果我们首先创建一个组合列表并尝试匹配这些组合会怎样?我们从解决方案 1 中知道这个列表应该包含原始值。例如:
var computed = ids1.Zip(ids2, (i1,i2) => i1 * i2); // [2,6]
和 LINQ 语句:
from entity in db.Table
where computed.Contains(entity.Id1 * entity.Id2)
select entity
这种方法存在一些问题。首先,您会看到这也返回实体
{1,6}
.组合函数 (a*b) 不会生成唯一标识数据库中一对的值。现在我们可以创建一个字符串列表,如
["Id1=1,Id2=2","Id1=2,Id2=3]"
并做
from entity in db.Table
where computed.Contains("Id1=" + entity.Id1 + "," + "Id2=" + entity.Id2)
select entity
(这适用于 EF6,而不适用于早期版本)。
Id1
上的任何数据库索引和
Id2
本来可以使用的。这将执行非常非常差。
Contains
的组合和一个
join
在内存中:首先执行解决方案 3 中的 contains 语句。请记住,它使我们非常接近我们想要的。然后通过将结果作为内存列表加入来优化查询结果:
var rawSelection = from entity in db.Table
where ids1.Contains(entity.Id1) && ids2.Contains(entity.Id2)
select entity;
var refined = from entity in rawSelection.AsEnumerable()
join pair in Tuples on new { entity.Id1, entity.Id2 }
equals new { Id1 = pair.Item1, Id2 = pair.Item2 }
select entity;
它可能并不优雅、凌乱,但到目前为止,它是我发现并应用于我自己的代码中的唯一可扩展的解决方案。
from entity in db.Table // db is a DbContext
join i in MyIntegers on entity.Id1 equals i
select entity
但是生成的 SQL 是荒谬的。一个真实的例子,其中
MyIntegers
只包含 5(!) 个整数,如下所示:
SELECT
[Extent1].[CmpId] AS [CmpId],
[Extent1].[Name] AS [Name],
FROM [dbo].[Company] AS [Extent1]
INNER JOIN (SELECT
[UnionAll3].[C1] AS [C1]
FROM (SELECT
[UnionAll2].[C1] AS [C1]
FROM (SELECT
[UnionAll1].[C1] AS [C1]
FROM (SELECT
1 AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
UNION ALL
SELECT
2 AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable2]) AS [UnionAll1]
UNION ALL
SELECT
3 AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable3]) AS [UnionAll2]
UNION ALL
SELECT
4 AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable4]) AS [UnionAll3]
UNION ALL
SELECT
5 AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable5]) AS [UnionAll4] ON [Extent1].[CmpId] = [UnionAll4].[C1]
有 n-1
UNION
s。当然,这根本不是可扩展的。
UNION
s 变得更简单,它们不再嵌套。以前查询会在本地序列中少于 50 个元素时放弃(SQL 异常:SQL 语句的某些部分嵌套太深。)非嵌套
UNION
允许本地序列多达几千(!)个元素。尽管具有“许多”元素,但它仍然很慢。
Contains
语句是可扩展的:
Scalable Contains method for LINQ against a SQL backend
关于c# - EntityFramework - 包含复合键的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26198860/
我有三张 table 。表 A 有选项名称(即颜色、尺寸)。表 B 有选项值名称(即蓝色、红色、黑色等)。表C通过将选项名称id和选项名称值id放在一起来建立关系。 我的查询需要显示值和选项的名称,而
在mysql中,如何计算一行中的非空单元格?我只想计算某些列之间的单元格,比如第 3-10 列之间的单元格。不是所有的列...同样,仅在该行中。 最佳答案 如果你想这样做,只能在 sql 中使用名称而
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在为版本7.6进行Elasticsearch查询 我的查询是这样的: { "query": { "bool": { "should": [ {
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
是否可以编写一个查询来检查任一子查询(而不是一个子查询)是否正确? SELECT * FROM employees e WHERE NOT EXISTS (
我找到了很多关于我的问题的答案,但问题没有解决 我有表格,有数据,例如: Data 1 Data 2 Data 3
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
我从 EditText 中获取了 String 值。以及提交查询的按钮。 String sql=editQuery.getText().toString();// SELECT * FROM empl
我有一个或多或少有效的查询(关于结果),但处理大约需要 45 秒。这对于在 GUI 中呈现数据来说肯定太长了。 所以我的需求是找到一个更快/更高效的查询(几毫秒左右会很好)我的数据表大约有 3000
这是我第一次使用 Stack Overflow,所以我希望我以正确的方式提出这个问题。 我有 2 个 SQL 查询,我正在尝试比较和识别缺失值,尽管我无法将 NULL 字段添加到第二个查询中以识别缺失
什么是动态 SQL 查询?何时需要使用动态 SQL 查询?我使用的是 SQL Server 2005。 最佳答案 这里有几篇文章: Introduction to Dynamic SQL Dynami
include "mysql.php"; $query= "SELECT ID,name,displayname,established,summary,searchlink,im
我有一个查询要“转换”为 mysql。这是查询: select top 5 * from (select id, firstName, lastName, sum(fileSize) as To
通过我的研究,我发现至少从 EF 4.1 开始,EF 查询上的 .ToString() 方法将返回要运行的 SQL。事实上,这对我来说非常有用,使用 Entity Framework 5 和 6。 但
我在构造查询来执行以下操作时遇到问题: 按activity_type_id过滤联系人,仅显示最近事件具有所需activity_type_id或为NULL(无事件)的联系人 表格结构如下: 一个联系人可
如何让我输入数据库的信息在输入数据 5 分钟后自行更新? 假设我有一张 table : +--+--+-----+ |id|ip|count| +--+--+-----+ |
我正在尝试搜索正好是 4 位数字的 ID,我知道我需要使用 LENGTH() 字符串函数,但找不到如何使用它的示例。我正在尝试以下(和其他变体)但它们不起作用。 SELECT max(car_id)
我有一个在 mysql 上运行良好的 sql 查询(查询 + 连接): select sum(pa.price) from user u , purchase pu , pack pa where (
我是一名优秀的程序员,十分优秀!