Linq um para muitos inserção quando muitos já existe
Pergunta
Então, eu sou novo para LINQ para ser avisado o que estou fazendo pode ser completamente estúpido!
Eu tenho uma tabela de caseStudies e uma mesa de Serviços com muitos para muitos relasionship
os estudos de caso já existem e eu estou tentando inserir um serviço, enquanto que liga alguns estudos de caso que já existem para isso. Eu estava presumindo algo como isso iria funcionar?
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()
};
Mas isso não é correto, pois reclama
Não é possível converter implicitamente tipo 'System.Linq.IQueryable' para 'System.Data.Objects.DataClasses.EntityCollection'
Pode alguém por favor me mostre o caminho correto.
Agradecemos antecipadamente
Solução
Yo tem que adicionar o resultado da consulta para a coleção de estudos de caso em vez de tentar substituí-lo.
var service = new Service { ... };
foreach (var caseStudy in db.CaseStudies.Where(s => s.Name == caseStudyName)
{
service.CaseStudies.Add(caseStudy);
}
Você pode quebrar isso em um método de extensão e obter uma sintaxe agradável.
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);
}
}
}
E agora você começa o seguinte.
var service = new Service { ... };
service.CaseStudies.AddRange(db.CaseStudies.Where(s => s.Name == caseStudyName));