返回匿名类型时的正确类型

时间:2014-03-18 07:47:48

标签: c# linq

我在数据库中有字母和用户表:

  1. User("Id", "Name")
  2. Letter("Id", "UserId", "Title")
  3. 我在课堂上使用此代码获取字母列表:

    public static mytype GetList()
    {
         var lst = (from l in Letters.ToList()
                   select new {l.Id, l.Title, l.tblUsers.Name}).ToList();
         return lst;
    }
    

    请帮我选择合适的类型。我不想使用这段代码:

    public static List<Letter> GetList()
    {
         List<Letter> lst = new List<Letter>();
         lst = (from l in Letters.ToList()
                select l).ToList();
         return lst;
    }
    

4 个答案:

答案 0 :(得分:1)

您需要为此定义类型。

new {l.Id, l.Title, l.tblUsers.Name}

是匿名类的定义。要将其用作返回值,您应定义structclass,表示您要返回的信息。您可以使用dynamic,但在更改返回的数据结构时很容易导致运行时错误,因为方法的调用者不知道返回值的样子。

例如:

struct UserLetter { 
    public Guid Id {get;set;}
    public string Title {get;set;}
    public string AuthorName {get;set;}
}

public static IList<UserLetter> GetList()
{
     return (from l in Letters
            select new UserLetter
            { Id = l.Id, Title = l.Title, AuthorName = l.tblUsers.Name}).ToList();
}

答案 1 :(得分:0)

您正在创建一个匿名类型,因此您可以创建一个包含您感兴趣的属性的新类或使用动态对象

public static IEnumerable<dynamic> GetList()
{
     var lst = (from l in Letters.ToList()
               select new {Id = l.Id, Title = l.Title, UserName = l.tblUsers.Name}).ToList();
     return lst;
}

然后在你的调用代码中迭代动态对象并调用动态属性

foreach (var dynamicObject in GetList())
{
    Console.WriteLine(dynamicObject.UserName);
}

除非您的动态对象在您的应用程序中具有非常小的范围,否则新类可能是更好的选择,因为您将从类型检查中受益

答案 2 :(得分:0)

试试这个

class mytype
{ 
 public int id;
 public string title;
 public string name;
}
public static List<mytype> GetList()
{
 return (from l in Letters.ToList() select new mytype{id=l.Id,title=l.Title,  name=l.tblUsers.Name}).ToList();
}

答案 3 :(得分:0)

您需要使用用户表应用联接。

public static List<objLetter> GetList()
{
 List<objLetter> lst = new List<objLetter>();
 lst = from ltr in Letters
       join user in Users on ltr.UserId equals user.UserId
       select new objLetter {Id = ltr.Id , Title = ltr.Title, Name = user.Name })
 return lst;
}