从方法返回多个值的正确方法

时间:2014-09-03 11:43:43

标签: c# linq entity-framework

我正在使用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();
}

这是一个很好的方法吗? 如果有人知道更好的方式,请分享..

由于

4 个答案:

答案 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)

对于正在寻找一种无需创建新类的方法的人,请使用outref参数-

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更加轻松灵活。

请参阅Anonymous Types

答案 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
            });
}