我有一个帐户数据库表。
每个帐户都有Id
和LinkedId
等字段。
LinkedId
用于存储与其关联的其他帐户的Id
。
我想偶尔查看“帐户”表以选择无效关联的帐户。
如果出现以下情况,则帐户无效:
其LinkedId
为零;
其LinkedId
等于其自己的Id
(即它与自身相关联);
其LinkedId
不是“帐户”表中帐户的Id
;
其LinkedId
是帐户的Id
,但该帐户LinkedId
不是第一个帐户的Id
(如果#3与#564链接,然后#564应与#3链接。
如何在不拖动数据库中的所有帐户的情况下执行此操作?
我正在使用C#,ASP.NET MVC和实体框架。
这就是我要去的地方:
List<Account> Accounts = db.Accounts
.Where(x => x.LinkedId == 0 || x.LinkedId == x.Id || ????????)
.ToList()
答案 0 :(得分:1)
使用简单的LINQ语句:
var accountsWithInvalidLinks =
from a in db.Accounts
let linkedAccount = db.Accounts.FirstOrDefault(a2 => a2.Id == a.LinkedId)
where a.LinkedId == 0 ||
a.LinkedId == a.Id ||
linkedAccount == null ||
linkedAccount.LinkedId != a.Id
select a;
如果您不是查询表达式语法的粉丝,那么这里有另一种选择。为避免重复,我将第3和第4个要求结合在一起,这可能会提高查询效率:
var accountsWithInvalidLinks =
db.Accounts.Where(a =>
a.LinkedId == 0 ||
a.LinkedId == a.Id ||
!db.Accounts.Any(a2 => a2.Id == a.LinkedId && a2.LinkedId == a.Id));