【发布时间】: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 时。
现在我有几个问题:
- 为什么会出现此错误以及如何实际访问 IEnumerable 集合的属性?我知道我可以使用 .ToList() 实现查询,然后在 [0].UserId 处访问它,但我认为这不是正确的方法吗?
- 从表中为单个记录选择单个列的最有效方法是什么(在我的例子中是 UserId)?该查询的外观如何(除了使用存储过程)。
有人可以帮帮我吗? :)
【问题讨论】:
-
在您的第一个查询中的
Select中:new Users是否意味着new User? -
@JSteward 不,这是来自数据库的现有记录,如果这是您的意思?
-
不,我的意思是
new Users在选择中新建一个具有复数名称的类似乎很奇怪。但是,如果您打算新建一个新的User,那将是有意义的。那么Users这个类型到底是什么? -
@JSteward Users 是一个从数据库生成的类......它基本上是一个数据库类。但是是的,在我的情况下,在这个例子中使用一个新的运算符是没用的......我应该这样做: .select(y=>y.UserId).FirstOrDefault() ?但与直接使用:FirstOrDefault(...) 相比,它会提高性能吗?
标签: c# performance entity-framework ienumerable