【问题标题】:Retrieving elements from a join with into Entity Framework从连接中检索元素到实体框架中
【发布时间】:2022-08-18 00:23:01
【问题描述】:

我有这个代码:

private IQueryable<Trip> GetTripWithBreaksAndPassengers(DB_Context context, long id)
{
    return from t in context.trip
           where t.Id == id
           join breaks in context.breaks on t.Id equals breaks.tripid into breaksJoin
           join drivers in context.drivers on t.Id equals drivers.tripid into driversJoin
           select new Trip() { TripBreaks = ?, TripDrivers = ?};
}

对于由id 指定的Trip,我想返回BreaksDrivers 的列表。

我的Trip 对象有两个字段是列表,TripBreaksTripDrivers

public virtual List<TripBreak> TripBreaks { get; set; }
public virtual List<TripDriver> TripDrivers { get; set; }

我希望它们都作为Trip 的一部分返回 - 我期待breaksJoindriversJoin 保留这些特定结果,但如果像这样查询

TripDrivers = driversJoin.ToList()

它会抛出一个错误。

我应该如何使用这些连接结果来获取元素?

  • TripDrivers = GetTripWithBreaksAndPassengers(ctx, 100).ToList();将为您提供导航属性。顺便说一句,你不应该传入你的数据库上下文,而是注入它。

标签: c# database entity-framework join


【解决方案1】:

EF 项目中的显式联接是一种代码异味。

您应该能够使用导航属性和Include() 来获取您想要的数据,就像这样。

var result = context.trip.Include(t => t.Breaks).Include(t => t.Drivers).FirstOrDefault(t => t.Id == id);

这将使您一口气获得所有相关实体。

相应地调整属性名称,因为您没有共享模型类。

【讨论】:

  • 包含和加入做同样的事情
  • 只是在非常初级的意义上。 Include() 对导航属性进行操作,可能是表拆分、TPC/TPH、拥有的实体等。不需要记住要加入哪一列,Include() 会为您处理这些。
猜你喜欢
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
相关资源
最近更新 更多