检查所有数据库条目是否成对链接

时间:2015-04-09 17:56:09

标签: c# sql entity-framework

我有一个帐户数据库表。

每个帐户都有IdLinkedId等字段。

LinkedId用于存储与其关联的其他帐户的Id

我想偶尔查看“帐户”表以选择无效关联的帐户。

如果出现以下情况,则帐户无效:

  1. LinkedId为零;

  2. LinkedId等于其自己的Id(即它与自身相关联);

  3. LinkedId不是“帐户”表中帐户的Id;

  4. LinkedId是帐户的Id,但该帐户LinkedId不是第一个帐户的Id(如果#3与#564链接,然后#564应与#3链接。

  5. 如何在不拖动数据库中的所有帐户的情况下执行此操作?

    我正在使用C#,ASP.NET MVC和实体框架。

    这就是我要去的地方:

    List<Account> Accounts = db.Accounts
        .Where(x => x.LinkedId == 0 || x.LinkedId == x.Id || ????????)
        .ToList()
    

1 个答案:

答案 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));