flying227
flying227

Reputation: 1321

How does one use .ToList() Inside of a Linq Query?

I've got a class that contains a list item. I would like for a linq query to populate the class, including this list. Here is my query:

var query = from c in context.Cars
            select new CarListItem()
            {
                ID = c.ID,                     
                Make = c.Make,
                AvailableColors = context.CarColors.Where(u => u.CarID == c.ID).ToList()
            };

Basically, I want to get a list of all of the cars, including a list of the available colors for each respective car.

The problem is that the inclusion of .ToList() within the query results in an error: An error occurred:

LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[CarSystem.Models.CarColors] ToList[CarColors](System.Collections.Generic.IEnumerable`1[CarSystem.Models.CarColors])' method, and this method cannot be translated into a store expression.

At this point, I don't know whether I am just using wrong syntax within the Linq query (should I use something other than .ToList()?) or if maybe the architecture of the models is wrong.

Upvotes: 2

Views: 1577

Answers (1)

jrummell
jrummell

Reputation: 43067

You can't. EF tries to translate ToList() to SQL and doesn't know how.

You could project to another type, then call ToList():

var query = (from c in context.Cars
        select new
        {
            ID = c.ID,                     
            Make = c.Make,
            AvailableColors = context.CarColors.Where(u => u.CarID == c.ID)
        }).ToList()
        .Select(c => new CarListItem()
        {
            ID = c.ID,                     
            Make = c.Make,
            AvailableColors = c.AvailableColors.ToList()
        });

or change the type of CarListItem.AvailableColors to IEnumerable<CarColor>:

var query = from c in context.Cars
        select new CarListItem()
        {
            ID = c.ID,                     
            Make = c.Make,
            AvailableColors = context.CarColors.Where(u => u.CarID == c.ID)
        };

Upvotes: 1

Related Questions