LINQ to SQL - 如何选择特定列并返回强类型列表

Mik*_*e M 41 asp.net linq-to-sql

我正在尝试使用LINQ to SQL从表中选择一些特定的列,并将结果作为强类型的对象列表返回.

例如:

var result = (from a in DataContext.Persons
                              where a.Age > 18
                              select new Person
                              {
                                  Name = a.Name,
                                  Age = a.Age
                              }
                              ).ToList();
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

它构建良好,但是当我运行它时,我得到了错误.MyEntity不允许在查询中显式构造实体类型.

Meh*_*ari 81

基本上你是以正确的方式做到这一点.但是,您应该使用DataContextfor查询的实例(这不是DataContext一个实例或查询中的类型名称):

var result = (from a in new DataContext().Persons
              where a.Age > 18
              select new Person { Name = a.Name, Age = a.Age }).ToList();
Run Code Online (Sandbox Code Playgroud)

显然,Person该类是您的LINQ to SQL生成的实体类.如果您只想要一些列,则应创建自己的类:

class PersonInformation {
   public string Name {get;set;}
   public int Age {get;set;}
}

var result = (from a in new DataContext().Persons
              where a.Age > 18
              select new PersonInformation { Name = a.Name, Age = a.Age }).ToList();
Run Code Online (Sandbox Code Playgroud)

您可以在此处自由交换varList<PersonInformation>不会影响任何内容(因为这是编译器所做的).

否则,如果您在本地使用查询,我建议考虑匿名类型:

var result = (from a in new DataContext().Persons
              where a.Age > 18
              select new { a.Name, a.Age }).ToList();
Run Code Online (Sandbox Code Playgroud)

请注意,在所有这些情况下,result都是静态类型的(它的类型在编译时是已知的).后一种类型是List编译器生成的匿名类,类似于PersonInformation我上面写的类.从C#3.0开始,语言中没有动态类型.

更新:

如果你真的想要返回List<Person>(这可能是也可能不是最好的事情),你可以这样做:

var result = from a in new DataContext().Persons
             where a.Age > 18
             select new { a.Name, a.Age };

List<Person> list = result.AsEnumerable()
                          .Select(o => new Person {
                                           Name = o.Name, 
                                           Age = o.Age
                          }).ToList();
Run Code Online (Sandbox Code Playgroud)

您也可以合并上述语句,但为了清楚起见,我将它们分开.