【问题标题】:Filtering records by another table's FK to it通过另一个表的 FK 过滤记录
【发布时间】:2011-10-12 00:10:36
【问题描述】:

如何过滤我的 Linq-to-SQL 查询,使其仅显示其他表中未引用(通过 FK)的记录?

例如,我有两个表:TableA 和 TableB。 TableB 有一个引用 TableA 的 FK。我想从 TableA 中选择所有在 TableB 中没有引用它的记录的行。

在原始 T-SQL 中,我可以这样做:

SELECT * FROM TableA
WHERE NOT EXISTS (SELECT * FROM TableB WHERE TableA._id = TableB.fk_tablea_id)

在原始 MySQL 中,我可以进行左连接并在 where 子句中使用 ISNULL() 函数。

我不确定使用 LINQ to SQL 执行此操作的最佳方法。

【问题讨论】:

标签: c# .net linq tsql linq-to-sql


【解决方案1】:

您可以执行以下操作:

var ctx = new Context();
var rowAs = from TableA in ctx.TableAs
             where TableA.TableB.Count() > 0
             select TableA;

【讨论】:

  • 这很好用——谢谢! :) 我只需要将“> 0”更改为“==”。
【解决方案2】:

试试这个

  var result = from A in dbcontext.TableAs
               Where A.TableB == null
               select A;

【讨论】:

  • 这与我需要的相反。 TableA 没有引用 TableB,但我是从 TableA 中选择的。事实上,TableA 实际上是其他连接的结果 - 我在帖子中的示例只是保持测试用例简单。
  • 抱歉!我误解了你的意思。 Intellisense 实际上确实从 TableA 中弹出了对 TableB 的引用,即使 TableA 中实际上并不存在显式 FK 字段。但是,它似乎没有返回任何结果。
【解决方案3】:

我认为您正在寻找Except-operator: http://msdn.microsoft.com/en-us/library/bb386962.aspx

var x = (from a in db.TableA
        select a.Column).Except(from b in db.TableB
                               select b.Column);

【讨论】:

    【解决方案4】:

    如果您在实体 TableA 中有映射属性(例如 EntitySet 或 EntityRef,不同于“一对多”或“一对一”关系),则可以执行以下操作: 对于实体集:

    var tableAWithoutRelations= (from aRecord in TableAList where aRecord.TableB.Count()==0 select aRecord);
    

    对于 EntityRef:

    var tableAWithoutRelations= (from aRecord in TableAList where aRecord.TableB==null select aRecord);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多