【问题标题】:Fetching only one column from a table via where and select LINQ statement通过 where 和 select LINQ 语句从表中仅获取一列
【发布时间】:2018-03-28 21:15:45
【问题描述】:

我写了两个查询,如下所示:

  var loggedUser2 = ctx.Users.Where(y => y.Email == User.Identity.Name).Select(usr => new Users { UserId = usr.UserId }).AsEnumerable();

第二个查询如下所示:

var loggedUser = ctx.Users.FirstOrDefault(y => y.Email == User.Identity.Name);

据我所知,第二个查询显然需要更多时间从远程服务器的表中提取一条记录。

对于第一个查询,我收到一个错误:

无法在 LINQ to Entities 查询中构造实体或复杂类型“用户”。

当我尝试访问“用户”对象的属性 UserId 时。

现在我有几个问题:

  1. 为什么会出现此错误以及如何实际访问 IEnumerable 集合的属性?我知道我可以使用 .ToList() 实现查询,然后在 [0].UserId 处访问它,但我认为这不是正确的方法吗?
  2. 从表中为单个记录选择单个列的最有效方法是什么(在我的例子中是 UserId)?该查询的外观如何(除了使用存储过程)。

有人可以帮帮我吗? :)

【问题讨论】:

  • 在您的第一个查询中的Select 中:new Users 是否意味着new User
  • @JSteward 不,这是来自数据库的现有记录,如果这是您的意思?
  • 不,我的意思是new Users 在选择中新建一个具有复数名称的类似乎很奇怪。但是,如果您打算新建一个新的User,那将是有意义的。那么Users这个类型到底是什么?
  • @JSteward Users 是一个从数据库生成的类......它基本上是一个数据库类。但是是的,在我的情况下,在这个例子中使用一个新的运算符是没用的......我应该这样做: .select(y=>y.UserId).FirstOrDefault() ?但与直接使用:FirstOrDefault(...) 相比,它会提高性能吗?

标签: c# performance entity-framework ienumerable


【解决方案1】:

您可以声明一个 DTO,也可以使用这样的匿名类型:

var user = ctx.Users
   .Where(u => u.Email == email)
   .Select(u => new { UserId = u.UserId })
   .FirstOrDefault()    

【讨论】:

  • Zdravko,感谢您的回复...如果有的话,第二次查询会有多少性能提升??
  • 性能改进 - 可能不多(在这种情况下)。话虽如此,还有其他非常好的理由只选择您将要使用的内容。
  • 啊,好的,谢谢zdravko...例如,您能举几个例子吗?我正在尝试在这里学习更多可以记录下来的东西:)
  • @User987 它节省了内存(你创建了更小的对象),并且还提供了封装(你的数据的接收者并不知道它需要知道的数据)。至于速度,FirstOrDefault() 和 Where().FirstOrDefault() 的性能几乎相同。
猜你喜欢
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多