C#使用Include联接两个表。数据来自模型

时间:2019-01-28 21:15:36

标签: c# entity-framework linq

我对C#非常陌生,需要一些帮助。我正在处理其他人的代码,他们正在从模型中提取数据。我正在尝试加入两个表,需要使用Include,但错误是'==',无法将其应用于Guid和IQueryable。有人可以帮忙吗?预先感谢!

enter image description here

是的,我是

1 个答案:

答案 0 :(得分:2)

.Where()代表您的过滤器。 .Select()代表您想要返回的内容。如果您只想让实体退回,则不需要.Select()

例如,如果菜单项和MenuItemProgramData之间存在关联,则MenuItem包含对MenuItemProgramData的引用,那么您甚至不需要第一个ID select语句:

return context.DbMenuItems
  .Where(x => x.MenItemsProgramData.Plu == plu);

注意:如果您的上下文为各个顶级实体定义了DbSet<T>,则可以仅使用context.Ts而不是.GetItems<T>

如果存在关系,则这是首选方法。让SQL完成工作。如果您想与整个实体图进行交互,则方法的使用者可以进一步.Select()适用的数据,对其进行排序,分页,甚至附加.Include()

如果菜单项与该程序数据之间没有关系,并且知道来自第一个查询的项ID的数量将保持相对较小(例如,sub-100),那么:

var itemIds = context.DbMenuItemProgramDatas
  .Where(x => x.Plu == plu)
  .Select(x => x.MenuItemId)
  .ToList();

没有.ToList(),您正在处理一个IQueryable,当以后使用EF时,EF可能仍会尝试将其转换为SQL语句。通过使用.ToList(),它将执行SQL并填充List<int>。 (假设菜单项ID为int)

要获取IQueryable菜单项数据行:

return context.DbMenuItems
  .Where(x => itemIds.Contains(x.Id));

就是这样。

编辑:基于以下注释:“我想返回一个名为ParentId的字段,以了解它是否为空。仅此而已,但我需要链接两个表以获得该答案。”

此外,回顾原始代码,该方法的命名有点误导。 GetItemProgramDataForSubItems意味着返回MenuItemsProgramData而不是MenuItems...。但是,如果ParentId是MenuItem的属性,则此方法的调用者可以使用:

var hasParentId = context.GetItemProgramDataForSubItems(plu)
  .Any(x => x.ParentId.HasValue);

如果ParentId在MenuItemsProgramData上:

var hasParentId = context.GetItemProgramDataForSubItems(plu)
 .Any(x => x.MenuItemsProgramData.ParentId.HasValue);

除此之外,您可能希望详细说明实体和关系的外观,以及根据方法或业务逻辑要实现的目标。