使用 linq 在一个 SQL 查询 (EF6) 中为多个数据库列选择可能的值

Posted

技术标签:

【中文标题】使用 linq 在一个 SQL 查询 (EF6) 中为多个数据库列选择可能的值【英文标题】:Using linq to select possible values for multiple database columns in one SQL query (EF6) 【发布时间】:2021-12-14 22:54:09 【问题描述】:

假设我有一张桌子 EntityCol1, Col2,... Coln...

在我的应用程序中我有List1, List2,... Listn。我需要将列中的可能值分别加载到列表中。

我可以使用多个 linq 查询来做到这一点:

list1 = await context.Entities.Select(e => e.Col1).Distinct().ToListAsync();
list2 = await context.Entities.Select(e => e.Col2).Distinct().ToListAsync();
...

我也可以同时进行,但它仍然涉及多个 SQL 查询,每列(列表)一个。

是否可以仅在一个 SQL 查询中执行此操作?

我使用 EF6 作为 ORM。

【问题讨论】:

一个奇怪的要求。您的列不属于同一个表,或者您的列表应该合并。 @HenkHolterman 场景是这样的:我们有一个 Person 表,其中包含区域代码、部门、组等列。理想情况下,这些列应该是指向其他表(RegionCode、Department、Group 等)的指针) 但它们都存储为字符串,我无法更改。现在在页面中,我需要填充下拉列表以选择可能的值。所以我会有 RegionCode 下拉菜单、Department 下拉菜单、Group 下拉菜单... 好的,“您的列不属于同一个表”,但这超出了您的控制范围。那么EF不会提供帮助,afaik。要么执行 1 个大查询并执行内存中的 .Distnct().ToList(),要么执行多个查询。 您似乎正在尝试为 UI 下拉列表或查找控件返回数据。我会建议存储过程或功能。您可以使用枚举类型控制可以返回哪些列。这样,您的消费者不会为列名传递字符串,但您的模型控制可以通过这种方式检索哪些列的不同值。 听起来像是未来查询的经典用例,例如受支持。 Entity Framework Plus 扩展包 【参考方案1】:

你不能这样做:

var list1 = await context.Entities.Select(e => new  e.Col1, e.Cal2).Distinct().ToListAsync();

因为在这种情况下 distinct 是不同的(组合 distinct)

您可以尝试 JOIN 选项,但是您有 1 个结果列表,您可以将其拆分为两个列表,以获得相同的结果。 只要你想要两个列表作为结果,没有其他缺点的更好的解决方案。

考虑在数据库级别执行视图/物化视图,尤其是在表较大的情况下。 但即便如此,如果你做一个请求,你就会得到一个结果列表。

您的代码的更并行版本:

var task1= context.Entities.Select(e => e.Col1).Distinct().ToListAsync();
var task2 = context.Entities.Select(e => e.Col2).Distinct().ToListAsync();

var list1 = await task1;
var list2 = await task2;

【讨论】:

感谢您确认这是不可能的。我不认为你的代码更并行。 Task 更适合这种情况,恕我直言。

以上是关于使用 linq 在一个 SQL 查询 (EF6) 中为多个数据库列选择可能的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 EF6 优化 LINQ 查询

EF 6.x,LINQ-to-SQL和原始SQL子句

EF6 - 使用可为空属性(外键,TPH)时的无效 SQL 查询

LINQ 和 EF6:创建模型时无法使用上下文

EF6 Linq 查询。仅包括返回子表的第一个条目

在 MySQL Linq Query EF6 中使用多个 Include() 方法时出现 FormatException