Поиск данных из нескольких таблиц с использованием Entity Framework, Lambda Expressions и Repositorys pattern - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть класс InfoAppointment, и у этого класса есть внешний ключ Boat_Id класса Boat в его таблице.Я хотел бы показать все записи класса InfoApontamento, который содержит конкретную лодку.Как бы я использовал внешний ключ класса лодки, который находится в таблице infoAppointment, чтобы найти конкретную лодку, используя лямбда-выражения и репозитории?Это отношение «один ко многим»

public  class InfoAppointment : Entity
{      
    public string Status { get; set; }

    public string Code{ get; set; }

    public string Observation{ get; set; }

    public virtual Boat Boat { get; set; }
}

public class Boat : Entity
{
    public Guid BoatId { get; set; }
    public virtual InfoAppointment  InfoAppointment { get; set; }
} 

Мой пример хранилища

public virtual IEnumerable<TEntity> Search(Expression<Func<TEntity, bool>> predicate)
{
    return Dbset.Where(predicate);
}

public class InfoAppointment Repository : Repository<InfoAppointment >, IInfoAppointmentRepository
{
    public InfoAppointmentRepository(RveContext rveContext) : base(rveContext)
    {
    }

    public InfoAppointment GetBoatByName(string boatName)
    {
        // HOW TO GET THE BOATS USING THE FK
    }

    public InfoAppointment GetByCode(string code)
    {
        return Search(c => c.active && !c.excluded && c.Code== code).FirstOrDefault();
    }
}

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Я думаю, что проблема в вашем отношении.У класса лодки должен быть список InfoAppointment, а не один объект.
Я не вижу случая, почему у вас есть лодка, которая может иметь только одно назначение.

Однако, если это все еще так, простоquery (c => c.Boat?.Name == name), ленивая загрузка сделает все остальное.

Редактировать: Для определения внешнего ключа в вашей модели БД используйте [ForeignKey("BoatId")] аннотацию, как описано здесь: http://www.entityframeworktutorial.net/code-first/foreignkey-dataannotations-attribute-in-code-first.aspx

Итак, ваше InfoAppointmentкласс должен выглядеть так:

public  class InfoAppointment : Entity
{      
public string Status { get; set; }

public string Code{ get; set; }

public string Observation{ get; set; }

public int BoatId { get; set; }

[ForeignKey("BoatId")]
public virtual Boat Boat { get; set; }
}
0 голосов
/ 27 декабря 2018

Вы можете использовать синтаксис .Include.

Пожалуйста, обратитесь в блог по адресу: http://foreverframe.net/when-use-include-with-entity-framework/

Код:

var author = context.Boat.Include(a => a.InfoAppointment).FirstOrDefault(c=> c.Boat != null c.Boat.Name == <<name>>);

0 голосов
/ 27 декабря 2018

Вы можете попробовать:

public InfoAppointment GetByBoatName(string name) // this name is more semantically correct
{
    return Dbset.FirstOrDefault(c => c.Boat != null && c.Boat.Name == name);
}

И вам не нужно использовать Where до FirstOrDefault - последний также может принимать предикаты, поэтому вы можете изменить метод GetByCode (или простоиспользуйте FirstOrDefault в методе Search).

Редактировать:

Для случая, когда у лодки несколько назначений.Я предлагаю вам действительно следующее определение:

public class Boat : Entity
{
  public Guid BoatId { get; set; }
  public virtual List<InfoAppointment> InfoAppointments { get; set; }
} 

Чтобы вернуть все встречи для выбранной лодки:

public List<InfoAppointment> GetAllByBoatName(string name)
{
  return Boats.First(c => c.Name == name).InfoAppointments.ToList();
}

Чтобы вернуть одну встречу для выбранной лодки:

public InfoAppointment GetOneByBoatName(string name, 
    Expression<Func<TEntity, bool>> predicate)
{
  return Boats.First(c => c.Name == name).InfoAppointments.FirstOrDefault(predicate);
}
...