如何编写传入Color实体列表查询匹配Materials的LINQ to Entities语句?
解决方案
实现思路
- 首先提取传入颜色的
guid集合作为判断依据,避免实体对比在LINQ to Entities中不被支持的问题,同时查询效率更高 - 筛选材质时,要求所有传入的颜色guid都存在于当前材质关联的颜色guid列表中,即可得到包含全部指定颜色的材质
完整代码
Public Shared Function getMaterialsFromColor(vColors As List(Of Entities.Color)) As List(Of Entities.Materials) ' 提取传入颜色的guid集合 Dim targetColorGuids = vColors.Select(Function(c) c.guid).ToList() ' 这里把dbContext替换为你项目中实际的EF实体上下文对象 Dim result = (From vmaterial In dbContext.Materials Where targetColorGuids.All(Function(g) vmaterial.colors.Select(Function(c) c.guid).Contains(g)) Select vmaterial).ToList() Return result End Function
补充说明
- 如果后续需求调整为只要包含任意一个传入颜色的材质,把上述代码中的
All方法换成Any即可 - 用guid做对比是为了兼容LINQ to Entities的SQL转换规则,避免运行时抛出"无法识别的方法"类异常,性能也比直接对比实体对象更好
内容的提问来源于stack exchange,提问作者Asier
相关产品推荐
相关产品推荐

