在Linq中当我调用SingleOrDefault或FirstOrDefault时,如何为特定对象返回除null之外的其他内容,例如。
List<CrazyControls> cc = CrazyControlRepository.All();
cc.SingleOrDefault(p => p.Id == id).Render();
如何让我的CrazyControls返回一个实现基本Render()方法的默认实例?
答案 0 :(得分:7)
DefaultIfEmpty(defaultValue)
。这将确保如果集合为空,则将使用该类型的默认实例填充它。
所以你可以这样做:
var defaultValue = new CrazyControl(...);
List<CrazyControls> cc = CrazyControlRepository.All();
cc.Where(p => p.Id == id).DefaultIfEmpty(defaultValue).First().Render();
需要更改位的查询表达式。新的工作原理如下:
DefaultIfEmpty
确保序列中只包含一个项目(如果已有项目,DefaultIfEmpty
将不执行任何操作)。First
获取单个项目。我没有使用Single
而不是第一个的原因是,如果谓词不同(或将来会发生变化)并且它接受了多个项目,Single
会抛出。答案 1 :(得分:3)
如果没有元素,你需要定义你想要返回的“东西”:
(cc.SingleOrDefault(p => p.Id == id) ?? new CrazyControls()).Render();
换句话说,您需要定义default value
。