C# 通过where和select LINQ语句仅从表中获取一列

C# 通过where和select LINQ语句仅从表中获取一列,c#,performance,entity-framework,ienumerable,C#,Performance,Entity Framework,Ienumerable,我编写了两个查询,如下所示: 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)

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

  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);
var user = ctx.Users
   .Where(u => u.Email == email)
   .Select(u => new { UserId = u.UserId })
   .FirstOrDefault()    
正如我所知,第二个查询从远程服务器的表中提取单个记录需要花费更多的时间

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

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

当我尝试访问“Users”对象的属性UserId时

现在我有几个问题:

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

  • 有人能帮我吗?:)

    您可以声明DTO,也可以使用以下匿名类型:

    var loggedUser = ctx.Users.FirstOrDefault(y => y.Email == User.Identity.Name);
    
    var user = ctx.Users
       .Where(u => u.Email == email)
       .Select(u => new { UserId = u.UserId })
       .FirstOrDefault()    
    

    在第一个查询中的
    选择
    中:
    新用户
    是否意味着要成为
    新用户
    ?@JSteward否,这是DB的现有记录,如果这是您的意思的话?否,我指的是
    新用户
    片段在选择中使用复数名称新建类似乎很奇怪。但是,如果您打算新建一个新的
    用户
    ,这是有意义的。那么,
    Users
    的类型到底是什么呢?@JSteward Users是从数据库生成的一个类。。。它基本上是一个DB类。但是,是的,很好的一点,在我的例子中,在这个例子中使用一个新的操作符是没有用的。。。我应该这样做:。选择(y=>y.UserId)。FirstOrDefault()?但是,与直接使用:FirstOrDefault(…)相比,这会是一种性能改进吗?Zdravko,感谢您的回复。。。在第二个查询中,如果有性能改进的话,性能改进的程度会有多大?可能不会有多大(在本例中)。话虽如此,还有其他非常好的理由只选择你要使用的东西。啊,好的,谢谢zdravko。。。举个例子,你能说出几个吗?我想在这里学到更多的东西,我可以记下来:)@User987它可以节省内存(创建更小的对象),还可以提供封装(数据的接收者对数据的了解不超过它所需要的)。至于速度,FirstOrDefault()和Where()。FirstOrDefault()的性能几乎相同。