【问题标题】:Is there a better way to select multiple rows in Entity Framework?有没有更好的方法在实体框架中选择多行?
【发布时间】:2023-03-06 01:15:01
【问题描述】:

我只是想知道,根据下面的代码,有没有比创建列表列表更好的方法来从多行中获取数据?

这不是一个真正的问题,更多的是代码异味,因为一个可能有 50 多行,这种解决方案在这种情况下是不切实际的。

任何和所有帮助将不胜感激 =]

class Manage
{
    List<string> UserNames = new List<string>();
    List<string> Lockoutenabled = new List<string>();
    List<string> AccessFailedCount = new List<string>();

    List<List<string>> Details = new List<List<string>>();

    VatsWebEntitiesManage ManageEntity = new VatsWebEntitiesManage();

    public List<List<string>> FetchUserDetails()
    {
        var usernames = ManageEntity.AspNetUsers.Select(m => m.UserName);
        var lockouts = ManageEntity.AspNetUsers.Select(l => l.LockoutEnabled);
        var AccessFailedCounts = ManageEntity.AspNetUsers.Select(afc => afc.AccessFailedCount);

        foreach (var item in usernames)
        {
            UserNames.Add(item);
        }
        foreach (var item in lockouts)
        {
            Lockoutenabled.Add(item.ToString());
        }
        foreach (var item in AccessFailedCounts)
        {
            AccessFailedCount.Add(item.ToString());
        }

        Details.Add(UserNames);
        Details.Add(Lockoutenabled);
        Details.Add(AccessFailedCount);

        return (Details);
    }
}

【问题讨论】:

  • 您返回的目标是什么?你不能只定义一个 UserDetail 类并为它们创建一个 IEnumerable 吗?
  • 我希望能够返回所有行,但我只需要一组行 I.E var query= Select * from MyDB where UserID==db.userID, return query.firstordefault

标签: c# linq generics collections


【解决方案1】:

为什么你没有一个类,UserDetails(甚至只是使用 AspNetUser 类),它具有 Username、lockoutenabled 和 accessfailedcount 作为属性。然后加载它并返回它的 IEnum。

return from u in ManageEntity.AspNetUsers
    select new UserDetails{
        Username = u.UserName,
        Lockouts = u.LockoutEnabled,
        AccessFailedCounts = u.AccessFailedCount
    };

【讨论】:

    【解决方案2】:

    您应该阅读有关 EF 的一些详细信息。 我想你想存档:

    1. 从行中获取列表
    2. 最佳性能

    我只是演示了一个列表如下:

      var usernames = ManageEntity.AspNetUsers.AsQueryable().Select(m => m.UserName).ToList();
    
    1. ToList() 获取列表。
    2. AsQueryable() 不会从 D B。所以获得更好的性能

    .希望对你有用。

    【讨论】:

      【解决方案3】:

      最好有一个包含你需要的所有属性的类:

      public class UserDetail
      {
          public String UserName {get; set;}
          public String LockoutEnabled {get; set;}
          public String AccessFailedCount {get; set;}
      }
      

      然后创建一个 UserDetails 列表,例如:

      var list = (from u in ManageEntity.AspNetUsers
                 select new UserDetail
                    {
                       UserName = u.UserName,
                       LockoutEnabled = u.LockoutEnabled,
                       AccessFailedCounts = u.AccessFailedCount
                    }).ToList();
      

      请原谅任何语法问题,我远离我的代码编辑器:)

      【讨论】:

        【解决方案4】:

        首先:使用使用

             using (var c = ManageEntity())
                 {
                     // Your code
                 }
        

        我不明白你的List&lt;List&lt;string&gt;&gt;。如果所有数据都已连接,您可以创建一个包含您需要的所有属性的类并填充它。

        public class Data
        {
         public string UserName {get; set;}
         public string Lockoutenabled {get; set;}
         public string AccessFailedCount {get; set;}
        }
        

        并添加所有数据

        public List<Data> FetchUserDetails()
            {
                using (var c = ManageEntity())
                     {
                         return c.AspNetUsers.Select(m => new Data{
                                            UserName= m.UserName,
                                            LockoutEnabled=m.LockoutEnabled,
                                            AccessFailedCount=m.AccessFailedCount
                                           }).ToList()
                     }
        
            }
        

        类似这样的:)

        【讨论】:

          【解决方案5】:

          我认为您让我们大多数人感到困惑,不知道您要在这里完成什么。做我认为你想做的事情的典型方法是拥有一个类似

          的函数
          public class Manage
          {
              private VatsWebEntitiesManage ManageEntity = new VatsWebEntitiesManage();
          
              public List<AspNetUser> Users { get; set; }
          
              public List<AspNetUser> FetchUserDetails()
              {
                  var users = ManageEntity.AspNetUsers.ToList();
                  return Users = users;
              }
          }
          

          虽然我不确定为什么您希望列表成为类的属性以及返回列表的函数..不管..然后您只需要获取List&lt;AspNetUser&gt; 并获取您的信息需要..

          如果您需要所有用户名的列表。

          var userList = FetchUserDetails();
          var names = userList.Select(a => a.UserName).ToList();  //List<string>
          var lockouts = userList.Select(a => a.Lockouts.ToString()).ToList();  //List<string>
          

          如果您想要第一个用户或具有某个 Id 的用户。

          var user = userList.FirstOrDefault(a => a.UserId == userId);
          

          【讨论】:

            【解决方案6】:

            是的,您可以使用表的属性创建一个类,并且 从加入所有表后获取所有必需的值,但外键关系是 必填。

            例子

            class ABC()
            {
            
            public List<T1> t1 {get;set;};
            public List<T1> t2 {get;set;};
            public List<T1> t3 {get;set;};
            
            }
            
            List<ABC> lstABC = new List<ABC>();
                      lstABC = (from A in db.T1
                                join B in db.T2  on A.ID equals B.ID                       
                                join C in db.T3 on B.ID equals C.ID                                                
                                select new ABC
                                 {
                                   t1=A,
                                   t2=B,
                                   t3 =C  
            
                                 }).ToList(); 
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-06-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多