如何将变量定义为类型列表<<> f_AnonymousType1 <字符串,字符串>>

时间:2018-07-12 12:15:20

标签: 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();

返回类型为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>"

2 个答案:

答案 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();

其中UserLanguagesList<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,而ValueLanguage

答案 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; }
}