如何将变量定义为Type List <<> f_AnonymousType1 <string,string >>

Edw*_*uay 4 c# linq generics

我在监视窗口看到以下LINQ语句

model.UserLanguages = (from u in db.Users
                    join l in db.Languages on u.LanguageId equals l.Id
                    select new {UserName = u.LastName, Language = l.Name}).ToList();
Run Code Online (Sandbox Code Playgroud)

返回一个类型的变量System.Collections.Generic.List<<>f_AnonymousType1<string,string>>.

我需要将它分配给模型类的属性,所以我需要能够明确地命名它的类型.像这样的东西:

public List<{string, string}> UserLanguages { get; set; }
Run Code Online (Sandbox Code Playgroud)

但是,由于这不是正确的语法,当然,我得到一个错误.

当我将其设置为:

public List<object> UserLanguages { get; set; }
Run Code Online (Sandbox Code Playgroud)

我收到错误:

The type "System.Collections.Generic.List<<anonymous type: string UserName, string Language>>" cannot be converted to "System.Collections.Generic.List<object>"
Run Code Online (Sandbox Code Playgroud)

Him*_*ere 7

你不能这样做,一个匿名类只是 - 好吧,匿名 - 它没有你可以在任何地方使用的名字.来自MSDN:

您不能将方法的字段,属性,事件或返回类型声明为具有匿名类型.

而只是创建一个命名类,然后创建它的实例

class MyClass
{
    public string UserName { get; set; }
    public string Language { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在从查询中创建此类的实例:

model.UserLanguages = (from u in db.Users
                join l in db.Languages on u.LanguageId equals l.Id
                select new MyClass {UserName = u.LastName, Language = l.Name}).ToList();
Run Code Online (Sandbox Code Playgroud)

这里UserLanguages是一个List<MyClass>.这使得API的任何用户都清楚该终端中的实例具有a UserName和a Language.

没有一个班级的另一种方法是Dictionary<string, string>改为.

model.UserLanguages = (from u in db.Users
                join l in db.Languages on u.LanguageId equals l.Id
                select new MyClass {UserName = u.LastName, Language = l.Name}).ToDictionary(x => x.UserName, x => x.LastName);
Run Code Online (Sandbox Code Playgroud)

但这似乎不太直观,因为用户必须知道Key适用于a UserName,而Valuea是Language.