有没有更好的方法在Entity Framework中选择多行?

时间:2015-10-20 14:39:19

标签: c# linq generics collections

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

这不是一个真正的问题,更多的是代码味道,因为一个人可能有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);
    }
}

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您应该阅读有关EF的一些细节。 我想你要存档:

  1. 从行中获取列表
  2. 最佳表现
  3. 我只是说明一个列表如下:

      var usernames = ManageEntity.AspNetUsers.AsQueryable().Select(m => m.UserName).ToList();
    
    1. ToList()获取一个列表。
    2. AsQueryable()不会加载所有数据 D B。所以获得更好的表现
    3. 。希望它对你有用。

答案 2 :(得分:0)

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

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();

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

答案 3 :(得分:0)

首先:使用

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

我没有理解你的List<List<string>>。如果所有数据都已连接,您可以创建一个包含所需属性的类并填充它。

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()
             }

    }

像这样:)

答案 4 :(得分:0)

我认为你们大多数人都对你在这里要完成的事情感到困惑。做我认为你尝试做的事情的典型方法是拥有像

这样的功能
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<AspNetUser>和获取您需要的信息..

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

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);

答案 5 :(得分:0)

是的,您可以创建一个包含表格属性的类 在加入all表之后获取所有必需的值,但是外键关系是 必需的。

例如

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();