如何在C#.Net中返回包含来自LINQ查询结果的值的List类型变量?

时间:2015-03-06 14:20:08

标签: c# linq

我试图返回一个查询结果,其中包含登录用户的信息,将其存储在list数据类型中,但我的返回变量带有红色下划线,所以我可以在html页面上显示数据,但它在行上给出错误, 返回UserInfo; 说:

  

错误2无法将类型'Project.Models.User'隐式转换为   'System.Collections.Generic.List'

我不知道我的查询是否有效,但我只想尝试返回结果的第一行。这是我的代码:

public List<Models.User> GetUserInfo(Func<String> username)
{
    List<Models.User> UserInfo;

    if (username != null)
    {
        try{
            var User =  from m in db.MstUsers
                        where m.UserName == Convert.ToString(username)
                        select new Models.User
                        {
                            UserName = m.UserName,
                            FirstName = m.FirstName,
                            LastName = m.LastName,
                            EmailAddress = m.EmailAddress,
                            PhoneNumber = m.PhoneNumber

                        };

            if (User.Any())
            {
                var Info = new List<Models.User> { User.First() };
                UserInfo = Info.ToList();
            }
        }
        catch
        {
            UserInfo = new List<Models.User>();
        }

    }
    return UserInfo;
}

(编辑)我还创建了一个读取cookie的函数,这是我的代码:

 public String GetCookie()
        {
            string username = "";
            var cookie = Request.Headers.GetCookies("MyCookie").SingleOrDefault();

            if (cookie != null)
            {
                username = cookie["MyCookie"].Value;
            }

            return username;
        }

如何确定要返回的变量类型?使用List作为数据类型函数是不是正确的,这样我可以返回一个List变量?我真的很难理解在C#中返回值的概念。我仍然是C#.Net的新手,我根本不知道如何解决这个问题。我正在使用Visual Studio 2013.有人可以帮助我吗?

4 个答案:

答案 0 :(得分:1)

Linq的结果必须是IQueryable,所以你可以直接使用.ToList()。

答案 1 :(得分:0)

我认为您可以将代码更改为:

public List<Models.User> GetUserInfo(Func<String> username)
{
    List<Models.User> UserInfo = new List<Models.User>();

if (username != null)
{
    try{
        var User =  (from m in db.MstUsers
                    where m.UserName == Convert.ToString(username)
                    select new Models.User
                    {
                        UserName = m.UserName,
                        FirstName = m.FirstName,
                        LastName = m.LastName,
                        EmailAddress = m.EmailAddress,
                        PhoneNumber = m.PhoneNumber

                    }).FirstOrDefault();

        if (User != null)
        {
            UserInfo.Add(User);
        }
    }
    catch
    {
        UserInfo = new List<Models.User>();
    }

}
return UserInfo;
}

答案 2 :(得分:0)

如果User.Any()返回false,则不会初始化UserInfo。您必须设置默认值,例如:

List<User> UserInfo= null;

我不知道你为什么要通过Func<string>而不是:

Convert.ToString(username)

DO

 Convert.ToString(username())

我希望 的 db.MstUsers 是返回IEnumerable<User>或实现它的东西,否则它不会起作用

答案 3 :(得分:0)

你只是总是返回一个Models.User对象,试试这个。基本上你会收回你的一个对象,否则如果用户名为null或者在db DTO查找中找不到它,则为空对象:

public Models.User GetUserInfo(Func<String> username)    {
  User = new Models.User();
  if (username == null){return User;}
  try{
       User =  db.MstUsers.Where(
                  x => x.UserName==Convert.ToString(username)
               ).FirstOrDefault();
  }
  return User;
}

这会将User设置为空,然后在查询中找到值时设置为空。否则,它将通过并返回空用户。它将包含找到的一个用户,属性将是所有细节(用户名,名字等),除非失败,那么像User.UserName这样的东西将是null或空字符串。

就个人而言,我重写这一点永远不会返回一个空对象。 GetUserInfo应该返回对象或者失败 - 然后是调用它的代码,捕获异常,而不是测试null / empty-string。但那只是我。