首页 > 解决方案 > 从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)是什么?

我怎么能找到那个??

标签: c#entity-framework-6

解决方案


由于您使用的是.ToList()EF 将

  1. 从数据库中检索所有客户
  2. 将它们映射到客户对象
  3. 稍后,当您计算时GetOneColumn,您对它们进行投影(遍历已经物化的对象列表)

要仅检索一列,

  1. 从存储库中删除.ToList(),并返回一个IQueryable<Customers>
  2. 选择.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()等) ,就会发生这种情况


推荐阅读