【发布时间】:2020-11-06 14:08:07
【问题描述】:
我有一个 linq 查询,它给了我警告,但它仍然有效。我想摆脱警告。
uses First/FirstOrDefault/Last/LastOrDefault operation without OrderBy and filter which may lead to unpredictable results.
linq 查询是
var list = (from u in _db.user
join r in _db.resource on u.userId equals r.userId
join t in _db.team on u.bossId equals t.bossId
where r.pid == pid
select new MyDto
{
pid = pid,
userId = u.userId,
teamId = t.teamId,
name = t.name
}).GroupBy(d => d.userId).Select(x => x.First()).OrderBy(y => y.userId).ToList();
我使用 EntityFramework Core 2.1
更新:
我通过 cmets 更改了代码。
var list = (from u in _db.user
join r in _db.resource on u.userId equals r.userId
join t in _db.team on u.bossId equals t.bossId
where r.pid == pid
select new MyDto
{
pid = pid,
userId = u.userId,
teamId = t.teamId,
name = t.name
})
.GroupBy(d => d.userId)
.Select(x => x.OrderBy(y => y.userId)
.First())
.ToList();
然后有一个不同的警告。
LINQ 表达式 'GroupBy([user].userId, new MyDto() {pid = Convert(_8_locals1_pid_2, Int16), userId = [user].UserId, .....) 可以 不翻译,将在本地评估。
【问题讨论】:
-
尚不清楚您的警告来自何处:它不是内置警告之一。你能分享一下警告的代码吗?通常它的格式为“XX1234”
-
试试:
.Select(x => x.OrderBy(r=> r.Key).First()). -
为什么取消 OrderBy 会产生不可预知的结果?不需要 OrderBy,因此您可以删除。如果没有 OrderBy,结果会更加随机,因为代码会删除第一个项目并取决于写入数据的顺序。假设你每个月把所有的账单都存起来,然后堆成一堆。然后在月底,您只需选择前 5 名账单并支付。剩下的留到下个月。那么如果你不付房租怎么办?你会被驱逐吗?
-
警告是有道理的,如果你没有定义顺序,那么“第一”是什么意思?这将是一些数据库定义的顺序中的第一个,甚至不能保证每次都相同。
-
@Hello 无论有没有警告,您的查询都会在本地进行评估。
标签: c# linq entity-framework-core