我在监视窗口中看到以下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();
返回类型为System.Collections.Generic.List<<>f_AnonymousType1<string,string>>
的变量。
我需要将其分配给模型类的属性,因此我需要能够明确命名其类型。像这样:
public List<{string, string}> UserLanguages { get; set; }
但是,由于那不是正确的语法,所以我会得到一个错误。
当我将其设置为:
public List<object> UserLanguages { get; set; }
我得到了错误:
The type "System.Collections.Generic.List<<anonymous type: string UserName, string Language>>" cannot be converted to "System.Collections.Generic.List<object>"
答案 0 :(得分:7)
您不能这样做,匿名类就是-嗯,匿名-它没有可在任何地方使用的名称。来自MSDN:
您不能声明字段,属性,事件或返回类型 具有匿名类型的方法。
相反,只需创建一个命名类,然后创建一个实例
class MyClass
{
public string UserName { get; set; }
public string Language { get; set; }
}
现在从您的查询中创建此类的实例:
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();
其中UserLanguages
是List<MyClass>
。这对您的API的所有用户来说都很清楚,最后一个实例中的一个实例有一个UserName
和一个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);
但这似乎不太直观,因为用户必须知道Key
适用于UserName
,而Value
是Language
。
答案 1 :(得分:-1)
您可以使用dynamic
对象,也称为System.Dynamic.ExpandoObject
将模型属性声明为public List<System.Dynamic.ExpandoObject> UserLanguages { get; set; }
这是伪代码:
void Main()
{
Test db = new Test();
MyModel model = new MyModel();
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})
.Select(x=> {
dynamic expando = new System.Dynamic.ExpandoObject();
expando.UserName = x.UserName;
expando.Language = x.Language;
return (System.Dynamic.ExpandoObject)expando;
})
.ToList();
Console.WriteLine(((dynamic)model.UserLanguages[0]).UserName);
}
public class Test
{
public Test()
{
Users = new List<User>(){
new User(){
LanguageId = 1,
LastName = "Hello"
}
};
Languages = new List<Language>(){
new Language(){
Id = 1,
Name = "Test"
}
};
}
public List<User> Users{get;set;}
public List<Language> Languages{get;set;}
}
public class User
{
public int LanguageId{get;set;}
public string LastName{get;set;}
}
public class Language
{
public int Id{get;set;}
public string Name{get;set;}
}
public class MyModel
{
public List<System.Dynamic.ExpandoObject> UserLanguages { get; set; }
}