我在监视窗口看到以下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)
你不能这样做,一个匿名类只是 - 好吧,匿名 - 它没有你可以在任何地方使用的名字.来自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.