Linq uno a muchos insertos cuando ya existen muchos
Pregunta
¡Así que soy nuevo en linq, así que ten en cuenta que lo que estoy haciendo puede ser completamente estúpido!
Tengo una tabla de casos de estudio y una tabla de servicios con una relación de muchos a muchos
los estudios de caso ya existen y estoy tratando de insertar un servicio al vincular algunos estudios de caso que ya existen. ¿Estaba suponiendo que algo como esto funcionaría?
Service service = new Service()
{
CreateDate = DateTime.Now,
CreatedBy = (from u in db.Users
where u.Id == userId
select u).Take(1).First(),
Description = description,
Title = title,
CaseStudies = (from c in db.CaseStudies
where c.Name == caseStudy
select c),
Icon = iconFile,
FeatureImageGroupId = imgGroupId,
UpdateDate = DateTime.Now,
UpdatedBy = (from u in db.Users
where u.Id == userId
select u).Take(1).First()
};
Pero esto no es correcto ya que se queja
No se puede convertir implícitamente el tipo 'System.Linq.IQueryable' a 'System.Data.Objects.DataClasses.EntityCollection'
¿Puede alguien mostrarme la forma correcta?
Gracias de antemano
Solución
Debe agregar el resultado de la consulta a la colección de estudios de casos en lugar de intentar reemplazarlo.
var service = new Service { ... };
foreach (var caseStudy in db.CaseStudies.Where(s => s.Name == caseStudyName)
{
service.CaseStudies.Add(caseStudy);
}
Puede envolver esto en un método de extensión y obtener una buena sintaxis.
public static class ExtensionMethods
{
public static void AddRange<T>(this EntityCollection<T> entityCollection,
IEnumerable<T> entities)
{
// Add sanity checks here.
foreach (T entity in entities)
{
entityCollection.Add(entity);
}
}
}
Y ahora obtienes lo siguiente.
var service = new Service { ... };
service.CaseStudies.AddRange(db.CaseStudies.Where(s => s.Name == caseStudyName));