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

时间:2009-07-07 21:15:05

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

非常感谢任何帮助。

它构建良好,但是当我运行它时,我得到了错误。

是不允许在查询中明确构造实体类型MyEntity

3 个答案:

答案 0 :(得分:78)

基本上你是以正确的方式做到的。但是,您应该使用DataContext的实例进行查询(DataContext是一个实例或查询中的类型名称并不明显):

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

显然,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();

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

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

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

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

UPDATE:

如果你真的想要返回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();

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

答案 1 :(得分:3)

问题实际上是其中一个属性与另一个表的关系。我更改了我的LINQ查询,以便它可以从不同的方法获取相同的数据,而无需加载整个表。

谢谢大家的帮助!

答案 2 :(得分:0)

通过myid(该行的ID)调用数据库搜索,并返回特定的列:

var columns = db.Notifications
                .Where(x => x.Id == myid)
                .Select(n => new { n.NotificationTitle, 
                                   n.NotificationDescription, 
                                   n.NotificationOrder });