where中使用导航字段查询出错 返回
ISugarQueryable<AiAgrZbzDevInfEntity> entities = Db.Queryable<AiAgrZbzDevInfEntity>().OrderByDescending(it => it.dtinsertdate); entities = entities.Where(lambda) .WhereIF(stateList?.Length > 0, x => stateList.Any(y => x.Review.OrderByDescending(z => z.dtinsertdate).ToList().First().state == y));
需求是根据stateList中的值和审核状态(x.Review)对比后返回列表,因为审核数据会有多条,所以需要返回最新一条审核数据然后再进行对比,语句如上,现在报错“当前表达式x.Review.OrderByDescending(z => z.dtinsertdate).ToList().First().state 不支持,查看导航是否配置正确等或者缺少Includes()”,实体类配置是对的
热忱回答(17)
-
fate sta VIP0
2025/8/21x.Review.OrderByDescending(z => z.dtinsertdate).ToList().First().state
这个语法不支持。
0 回复 -
娇娇欲静 VIP0
2025/8/22@fate sta:那语句应该怎么写?
0 回复 -
fate sta VIP0
2025/8/22var list=stateList.Select(y =>x.Review).ToList()
变成一维变量
0 回复 -
娇娇欲静 VIP0
2025/8/22@fate sta:看不懂这个逻辑...大佬能再详细说说吗?需求是where完还需要分页,然后ToList()
0 回复 -
fate sta VIP0
2025/8/22var list=stateList.Orderbyxxxxx.Take(1).Select(y =>x.Review)ToList()
.WhereIF(stateList?.Length > 0, x => list.Any(s=>s.state==y)))0 回复 -
fate sta VIP0
2025/8/22把逻辑扔到外面
0 回复 -
娇娇欲静 VIP0
2025/8/22@fate sta:我没说清楚,stateList是个字符串数组,就是["0","2"]这样子的数,不是ISugarQueryable。Review是ISugarQueryable<AiAgrZbzDevInfEntity>的子实体,关系是一对多。现在我只需要最新的review实体,而非数组,然后让这个实体的state与stateList进行对比
0 回复 -
fate sta VIP0
2025/8/22SqlFunc.Subquery<类>().Where(关联).Where(s=>stateList.Contains(s.state)).OrderBy(XXX).Select(s=>s.state )
0 回复 -
fate sta VIP0
2025/8/22Where("sql")
如果比较复杂可以直接where sql实现
0 回复 -
娇娇欲静 VIP0
2025/8/22@fate sta:Subqueryable不能使用PartitionBy吗?
0 回复 -
fate sta VIP0
2025/8/22@娇娇欲静:不支持。 你可以用嵌套查询实现 ,不用子查询。
0 回复 -
娇娇欲静 VIP0
2025/8/22dynamic obj = new ExpandoObject(); ISugarQueryable<AiAgrZbzDevInfEntity> entities = Db.Queryable<AiAgrZbzDevInfEntity>(); var list = entities.Where(lambda).Select(x => new AiAgrZbzDevInfEntity { strno = x.strno.SelectAll(), Review = SqlFunc.Subqueryable<AiAgrReviewEntity>().Where(y => y.reviewno == x.strno).OrderByDesc(y => y.dtinsertdate).First() }) .OrderByDescending(x => x.dtinsertdate) .Includes(x => x.ZbzDevice, y => y.AreasDef) .ToList() .WhereIF(stateList?.Length > 0, x => x.Review != null && stateList.Any(y => x.Review.state == y)); if (pageIndex != 0 && pageSize != 0) { //获取满足条件的数据总条数 long count = list.Count(); obj.totalNumber = count; //使用count * 1.0 / pageSize 可以计算出数据总页数,考虑到有可能最后一页不满,使用Ceiling()取整 long pageCount = (long)Math.Ceiling(count * 1.0 / pageSize); obj.pageCount = pageCount; list = list.Skip((pageIndex - 1) * pageSize).Take(pageSize); } obj.list = list;@fate sta:返回数据中Review全部为空,但正常是有数据的,我反复确认过数据。另外,先ToList再分页的话,等以后数据多了,查询速度就受影响了,但是如果先分页再查询(即.Includes(x => x.ZbzDevice, y => y.AreasDef).ToList()的.ToList()去掉,移动变成obj.list = list.ToList()),会报错“当前表达式x.Review.state 不支持,查看导航是否配置正确等或者缺少Includes() ”
0 回复 -
娇娇欲静 VIP0
2025/8/22先分页再查询、不传stateList,生成的sql语句为
SELECT *,[x].[strno] as app_ext_col_0 FROM [AiAgrZbzDevInf] [x] WHERE ( 1 = 1 ) ORDER BY [dtinsertdate] DESC SELECT *,[x].[strno] FROM [AiAgrZbzDevice] WHERE [strno] = '59c7d1e670dd80aa' SELECT *,[x].[strno] FROM [AiAgrAreasDef] WHERE [strareaid] = 'id_1753239786450_39lgblr' SELECT * FROM ((SELECT TOP 1 *,0 as sugarIndex FROM [AiAgrReview] [y] WHERE ( [reviewno] = N'516643b13d17d7a3' ) ORDER BY [dtinsertdate] DESC)) TEMP UNION ALL SELECT * FROM ((SELECT TOP 1 *,1 as sugarIndex FROM [AiAgrReview] [y] WHERE ( [reviewno] = N'e0c7a633088ef4cc' ) ORDER BY [dtinsertdate] DESC)) TEMP
运行
SELECT * FROM ((SELECT TOP 1 *,0 as sugarIndex FROM [AiAgrReview] [y] WHERE ( [reviewno] = N'516643b13d17d7a3' ) ORDER BY [dtinsertdate] DESC)) TEMP UNION ALL SELECT * FROM ((SELECT TOP 1 *,1 as sugarIndex FROM [AiAgrReview] [y] WHERE ( [reviewno] = N'e0c7a633088ef4cc' ) ORDER BY [dtinsertdate] DESC)) TEMP
确认是有相关Review数据的
0 回复 -
娇娇欲静 VIP0
2025/8/25@fate sta:大佬,你看看Review为啥会丢失
0 回复 -
fate sta VIP0
2025/8/25select要扔tolist前面。还有疑问提供完的DEMO
0 回复 -
fate sta VIP0
2025/8/25https://www.donet5.com/Home/Doc?typeId=2366
提问模版。有DEMO我这边才能更快帮你定位问题。
0 回复 -
娇娇欲静 VIP0
2025/8/25我升级到最新版就好了
0 回复