2015-04-21 2 views
0

У меня есть эта функция:EntityFramework Фильтр списка по идентификатору

[HttpPost] 
[Route("")] 
/// <summary> 
/// Create a team 
/// </summary> 
/// <param name="model">The team model</param> 
/// <returns>The modified team model</returns> 
public async Task<IHttpActionResult> Create(TeamBindingViewModel model) 
{ 

    // If our model is invalid, return the errors 
    if (!ModelState.IsValid) 
     return BadRequest(ModelState); 

    // Get all our colours 
    var colours = await this.colourService.GetAllAsync(); 

    // Create our new model 
    var team = new Team() 
    { 
     Name = model.Name, 
     Sport = model.Sport 
    }; 

    // For each colour, Add to our team 
    team.Colours = colours.Join(model.Colours, c => c.Id, m => m.Id, (c, m) => new Colour { Id = c.Id, Hex = c.Hex, Name = c.Name }).ToList(); 

    // Create our team 
    this.service.Create(team); 

    // Save our changes 
    await this.unitOfWork.SaveChangesAsync(); 

    // Assign our Id to our model 
    model.Id = team.Id; 

    // Return Ok 
    return Ok(model); 
} 

Если я запускаю его, то EntityFramework вводит новые цвета в базу данных, а не ссылки на цвета. Я знаю, это потому, что я создаю новый цвет в моем соединении. Если я изменю свою функцию следующим образом:

[HttpPost] 
[Route("")] 
/// <summary> 
/// Create a team 
/// </summary> 
/// <param name="model">The team model</param> 
/// <returns>The modified team model</returns> 
public async Task<IHttpActionResult> Create(TeamBindingViewModel model) 
{ 

    // If our model is invalid, return the errors 
    if (!ModelState.IsValid) 
     return BadRequest(ModelState); 

    // Get all our colours 
    var colours = await this.colourService.GetAllAsync(); 

    // Create our new model 
    var team = new Team() 
    { 
     Name = model.Name, 
     Sport = model.Sport 
    }; 

    // For each colour, Add to our team 
    team.Colours = colours; 

    // Create our team 
    this.service.Create(team); 

    // Save our changes 
    await this.unitOfWork.SaveChangesAsync(); 

    // Assign our Id to our model 
    model.Id = team.Id; 

    // Return Ok 
    return Ok(model); 
} 

Все работает отлично. Единственное, что изменилось во втором фрагменте кода:

team.Colours = colours.Join(model.Colours, c => c.Id, m => m.Id, (c, m) => new Colour { Id = c.Id, Hex = c.Hex, Name = c.Name }).ToList(); 

стал

team.Colours = colours; 

который является список, полученный из базы данных. EntityFramework знает, что это не было изменено, поэтому оно просто ссылается на цвета вместо создания новых. Как я могу получить отфильтрованный список, чтобы сделать то же самое?

Приветствия, /r3plica

+0

Я бы спросил, в чем проблема, которую вы пытаетесь решить? Я не могу сказать из вашего 'join', что вы пытаетесь сделать. – user1477388

ответ

2

Хорошо, я знал, что это было просто. Я сменил проблемную строку на это:

// For each colour, Add to our team 
team.Colours = colours.Where(m => model.Colours.Any(c => c.Id == m.Id)).ToList(); 
Смежные вопросы