Len
Len

Reputation: 554

How to include FirstOrDefault() in ToList()

I want to get only one file for each recipe.

var UploadedFiles = (from rec in db.Recipes
                     join files in db.Files on rec.Id equals files.RecipeId
                     select new
                     {
                         files.Id,
                         files.Path,
                         files.RecipeId,
                         rec.Name,
                         rec.Description,
                         rec.Category,
                         rec.CookTime
                     }).ToList();
return new JsonResult { Data = UploadedFiles, JsonRequestBehavior = JsonRequestBehavior.AllowGet };

Upvotes: 0

Views: 3379

Answers (2)

gilmishal
gilmishal

Reputation: 1992

You could use group join instead of regular join, I presume it is also more efficient than the previous answer (with the let), although I am not fully aware of EF query optimizations in this case

var UploadedFiles = (from rec in db.Recipes
                 join files in db.Files on rec.Id equals files.RecipeId into g
                 let firstFile = g.FirstOrDefault()
                 select new
                 {
                     firstFile.Id,
                     firstFile.Path,
                     firstFile.RecipeId,
                     rec.Name,
                     rec.Description,
                     rec.Category,
                     rec.CookTime
                 }).ToList();

Update

since I don't use EF, I can't really confirm whether or not it handles nulls but I have been informed it doesn't you would have to remove nulls.

var UploadedFiles = (from rec in db.Recipes
                 join files in db.Files on rec.Id equals files.RecipeId into g
                 let firstFile = g.FirstOrDefault()
                 where firstFile != null
                 select new
                 {
                     firstFile.Id,
                     firstFile.Path,
                     firstFile.RecipeId,
                     rec.Name,
                     rec.Description,
                     rec.Category,
                     rec.CookTime
                 }).ToList();

Upvotes: 2

Nitesh Kumar
Nitesh Kumar

Reputation: 1774

You can try the following...

var UploadedFiles = (from rec in db.Recipes
                 from files in db.Files.FirstOrDefault(f => f.RecipeId == rec.Id)
                 select new
                 {
                     files.Id,
                     files.Path,
                     files.RecipeId,
                     rec.Name,
                     rec.Description,
                     rec.Category,
                     rec.CookTime
                 }).ToList();
return new JsonResult { Data = UploadedFiles, JsonRequestBehavior = 
JsonRequestBehavior.AllowGet };

Upvotes: 1

Related Questions