我正在使用LINQ查询获取userID和userRole,我将它们返回。 我想知道如何在返回数据后读取每个值。 这是代码。
public object[] GetUserInfoFromUsernameAndPassword(string userName, string password)
{
var userInfo = from u in STE.tblUsers
where u.UserName == userName
&& u.PWD == password
select new
{
u.UserID,
u.UserRole
};
return userInfo.ToArray();
}
这是一个很好的方法吗? 如果有人知道更好的方式,请分享..
由于
答案 0 :(得分:3)
此代码:
select new
{
u.UserID,
u.UserRole
};
创建一个只能在GetUserInfoFromUsernameAndPassword
方法中使用的匿名类。
因此,要在以后使用返回值,您需要创建一些类并返回此类的对象集合:
public class UserInfo
{
public int Id{get; set;}
public string Role{get; set;}
}
然后你需要修复你的查询:
var userInfo = from u in STE.tblUsers
where u.UserName == userName
&& u.PWD == password
select new UserInfo
{
Id = u.UserID,
Role = u.UserRole
};
最后一件事是更改方法的返回类型:
public UserInfo[] GetUserInfoFromUsernameAndPassword(string userName, string password)
之后,您将能够使用foreach
迭代整个集合,例如:
var users = GetUserInfoFromUsernameAndPassword("username", "password");
foreach(var user in users)
{
Console.WriteLine("{0} - {1}", user.Id, user.Role);
}
答案 1 :(得分:2)
对于正在寻找一种无需创建新类的方法的人,请使用out
或ref
参数-
public void GetUserInfoFromUsernameAndPassword(string userName, string password, out int userID, out string userRole)
{
var userInfo = from u in STE.tblUsers
where u.UserName == userName
&& u.PWD == password
select new
{
userID = u.UserID,
userRole = u.UserRole
};
}
从您的代码中调用它-
string username = "abc";
string password = "***";
string uid, role;
GetUserInfoFromUsernameAndPassword(username, password, out uid, out role);
Console.WriteLine(uid);
Console.WriteLine(role);
答案 2 :(得分:1)
由于匿名对象不能在其定义方法的范围之外访问,因此您必须使用dynamic
:
var data = GetUserInfoFromUsernameAndPassword(username, password);
foreach (dynamic item in data)
{
var userID = item.UserID;
var userRole = item.UserRole;
}
您也可以使用反射,但dynamic
更加轻松灵活。
答案 3 :(得分:0)
首先请原谅我稍微改写你的代码 - 我完全反对使用' SQLified' Linq代码在C#中。 为了遍历您的结果,您可以做各种各样的事情,但最多的是C#/ Linq'这样做的方法是通过foreach;请注意,如果您在方法结束时跳过枚举,并返回“IEnumerable”' (这是UserInfo,对吧?)你可以避免同时做所有事情,让编译器做一些优化。
在我的大脑中,这段代码看起来像这样:
public IEnumerable<UserInfo> GetUserInfoFromUsernameAndPassword(string userName, string password)
{
return STE.tblUsers
.Where(x => x.UserName == userName && x.PWD == password)
.Select(x => new UserInfo
{
UserID = x.UserID,
UserRole = x.UserRole
});
}
public void Iterate()
{
foreach (var userInfo in GetUserInfoFromUsernameAndPassword("username", "Password"))
Console.WriteLine(userInfo); // Do other stuff here...
}
由于您已经使用动态&#39;在您的示例代码中,您可以在&#39;选择&#39;中执行此类操作。相反,并完全跳过UserInfo类定义:
public IEnumerable<dynamic> GetUserInfoFromUsernameAndPassword(string userName, string password)
{
return STE.tblUsers
.Where(x => x.UserName == userName && x.PWD == password)
.Select(x => new
{
x.UserID,
x.UserRole
});
}