使用 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 【问题描述】:假设我有一张桌子 Entity
和 Col1, 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 - 使用可为空属性(外键,TPH)时的无效 SQL 查询
在 MySQL Linq Query EF6 中使用多个 Include() 方法时出现 FormatException