c# - 从mysql数据库中检索数据并过滤检索到的数据的优先级
问题描述
我只想检索数据库的一列。以下代码确实有效:
这是我在 mysql-table/model-in-EF6 中的客户
public partial class customers
{
public customers()
public int CustomerID { get; set; }
public string FullName { get; set; }
public string Mobile { get; set; }
public string Email { get; set; }
public string Address { get; set; }
public string Image { get; set; }
}
public List<customers> GetAllCustomers()
{
return myContext.customers.ToList();
}
这是我的问题:
var GetOneColumn = myContext.CustomerRepository.GetAllCustomers().Select(f=>f.FullName);
它是否从数据库中的客户中检索所有列,然后从检索到的数据中仅选择一列(FullName),它是否仅从数据库中检索一列(FullName)?如果它从数据库中检索所有数据,那么正确的代码(Linq)是什么?
我怎么能找到那个??
解决方案
由于您使用的是.ToList()
EF 将
- 从数据库中检索所有客户
- 将它们映射到客户对象
- 稍后,当您计算时
GetOneColumn
,您对它们进行投影(遍历已经物化的对象列表)
要仅检索一列,
- 从存储库中删除
.ToList()
,并返回一个IQueryable<Customers>
- 选择
.ToList()
后调用var GetOneColumn = myContext.CustomerRepository.GetAllCustomers().Select(f=>f.FullName).ToList();
所以,你的代码将是
public IQueryable<customers> GetAllCustomers()
{
return myContext.customers;
}
// later in code
var GetOneColumn = myContext.CustomerRepository.GetAllCustomers().Select(f=>f.FullName).ToList();
看看自己发生了什么!将您的代码分解为步骤并进行调试:
var allCustomers = myContext.CustomerRepository.GetAllCustomers();
var allCustomerNames = allCustomers.Select(f=>f.FullName);
或者,在您的数据库上运行探查器,或在 EF 中启用查询日志记录
要查看 EF 生成的所有查询,您可以执行以下操作
using (var context = new BlogContext())
{
context.Database.Log = Console.Write;
// Your code here...
}
在Entity Framework DbContext 执行的文档和日志查询中查看更多详细信息
如果您读到这里,那么有必要了解实际会导致 EF 发送查询的原因 - 请参阅查询的工作原理
基本上,只要您开始枚举 an 的元素IQueryable<T>
(包括 LINQ 方法,如First()
、Last()
、Single()
、ToList()
、ToArray()
等) ,就会发生这种情况
推荐阅读
- swiftui - 从 UIKit 调整 SwiftUI 组件
- sql - 更新时将查询的 SQL 数据保持在一种状态
- sql-server - 尽管能够通过其他方式连接,但无法使用 JDBC 连接到数据库(通信链接故障)
- linux - 尽管设置了“SSH keepalive”,但 MobaXterm ssh 不断断开连接
- python - 在python3.9中提取zipfile时出现错误'NotImplementedError(“不支持该压缩方法”)'
- ios - 可以使用 Amplify 从 Swift-App 调用 AWS-Lambda 函数
- c - 我可以转换成结构吗?
- javascript - 在同一页面上产生相同模式的多个相同组件?
- javascript - 为什么转换不适用于由反应创建的元素
- javascript - 在 Chrome 扩展程序上访问远程文件