繁体   English   中英

dbcontext 上的实体框架选择子句

[英]Entity framework select clause on a dbcontext

是否可以在 dbcontext.set 上使用 select 子句。 我有以下代码返回数据库表中 People 的所有共同保险并选择所有列。

public IQueryable<Person> GetPeople()
{
    return DbContext.Set<Person>();                
}

我只想选择用户名和电子邮件

var projection = GetPeople().Select(p => new {p.Username, p.Email});

在您的示例和 Jason 的示例中,您应该意识到您正在传递上下文感知对象这一事实。 对数据的进一步操作可能会导致对数据库的意外命中。 此外,当您执行像 DbContext.Set() 这样的函数时,您正在执行 EF 中最慢的数据库调用形式。 要获得最快和最有效的数据库调用,您可以执行以下操作:

 public List<GetPersonResult> GetPeople()
 {
       return (from p in dbContext.People
              select new GetPersonResult
              {
                   UserName = p.Username,
                   EmailAddress = p.Email
              }).ToList();
 }

 public class GetPersonResult
 {
       public string UserName{get;set;}
       public string EmailAddress{get;set;}
 }

原始 SQL 是 EF 使用最快的形式。 几乎和原始 ADO.NET 一样快。

这里:

public IQueryable<Person> GetPeople()
{
    return DbContext.Set<Person>().Select(per => new {per.UserName, per.Email})                
}

如果您想过滤结果,请添加一些重载,例如:

public IQueryable<Person> GetPeople()
{
    return DbContext.Set<Person>().Select(per => new {per.UserName, per.Email})                
}

public IQueryable<Person> GetPeople(int cityId)
{
    return DbContext.Set<Person>().Where(p => p.CityID == cityId)
               .Select(per => new {per.UserName, per.Email})                
}

如果要检索对象 person :

在“Person”类中添加构造函数

    public Person(string UserName, string EmailAddress){
      This.UserName = UserName;
      This.EmailAddress = EmailAddress;}

并修改此方法

public IQueryable<Person> GetPeople()
{
    return DbContext.Set<Person>()
                    .Select(per => new Person(per.UserName, per.Email));                 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM