我对C#非常陌生,需要一些帮助。我正在处理其他人的代码,他们正在从模型中提取数据。我正在尝试加入两个表,需要使用Include,但错误是'==',无法将其应用于Guid和IQueryable。有人可以帮忙吗?预先感谢!
是的,我是
答案 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);
除此之外,您可能希望详细说明实体和关系的外观,以及根据方法或业务逻辑要实现的目标。