LINQ to SQL - How to select specific columns and return strongly typed list LINQ to SQL - How to select specific columns and return strongly typed list asp.net asp.net

LINQ to SQL - How to select specific columns and return strongly typed list


Basically you are doing it the right way. However, you should use an instance of the DataContext for querying (it's not obvious that DataContext is an instance or the type name from your query):

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

Apparently, the Person class is your LINQ to SQL generated entity class. You should create your own class if you only want some of the columns:

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

You can freely swap var with List<PersonInformation> here without affecting anything (as this is what the compiler does).

Otherwise, if you are working locally with the query, I suggest considering an anonymous type:

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

Note that in all of these cases, the result is statically typed (it's type is known at compile time). The latter type is a List of a compiler generated anonymous class similar to the PersonInformation class I wrote above. As of C# 3.0, there's no dynamic typing in the language.

UPDATE:

If you really want to return a List<Person> (which might or might not be the best thing to do), you can do this:

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

You can merge the above statements too, but I separated them for clarity.


The issue was in fact that one of the properties was a relation to another table. I changed my LINQ query so that it could get the same data from a different method without needing to load the entire table.

Thank you all for your help!


Make a call to the DB searching with myid (Id of the row) and get back specific columns:

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