[英]Good way to select multiple rows with non-scalar list of keys using Entity Framework 4
[英]Is there a better way to select multiple rows in Entity Framework?
我只是想知道,按照下面的代码,有没有比创建列表列表更好的方法来从多行获取数据?
这不是一个真正的问题,因为一个人可能有 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);
}
}
为什么没有类 UserDetails(甚至只使用 AspNetUser 类),它具有 Username、lockoutenabled 和 accessfailedcount 作为属性。 然后加载它并返回它的IEnum。
return from u in ManageEntity.AspNetUsers
select new UserDetails{
Username = u.UserName,
Lockouts = u.LockoutEnabled,
AccessFailedCounts = u.AccessFailedCount
};
您应该阅读有关 EF 的一些详细信息。 我想你想存档:
我只是演示了一个列表如下:
var usernames = ManageEntity.AspNetUsers.AsQueryable().Select(m => m.UserName).ToList();
ToList()
获取列表。AsQueryable()
不会从数据库加载所有数据。 所以获得更好的表现.希望对你有用。
最好有一个包含您需要的所有属性的类:
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();
请原谅任何语法问题,我离我的代码编辑器很远:)
首先:使用 using
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()
}
}
像这样的东西:)
我认为您已经让我们大多数人对您在这里尝试完成的事情感到困惑。 做我认为你想做的事情的典型方法是拥有一个像
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);
是的,您可以使用表的属性创建一个类,并在加入所有表后获取所有必需的值,但需要外键关系。
例子
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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.