【问题标题】:LINQ to entites, query on entity then except from a list (composite key)LINQ to entity,然后从列表(复合键)中查询实体
【发布时间】:2014-09-23 12:04:01
【问题描述】:

我用几个过滤器查询一个实体 (InscriptionEcole)。该实体有一个复合键(InscriptionEcoleKey,7 个属性)。

另一方面,我有一个键列表(List)。

我的目标是从我的查询中删除其键存在于列表中的元组。

我该怎么做?

谢谢

InscriptionEcoleKey:

  • FkAnneeAnneeScolaire
  • FkClDegre
  • FkCllEcole
  • FkCllFormation
  • FkCllVersion
  • FkEleNumEleve
  • NumIns

InscriptionEcole 查询示例:

var ins = DataContext.InscriptionEcole.Where(
    i => i.FkAnneAnnee == "20132014"
      && i.FkCllEcole == "CIFOM"
      && i.Valide == "O"
);

【问题讨论】:

  • 您能否发布InscriptionEcoleKey 的结构和带有过滤器的基本示例查询

标签: c# linq entity-framework


【解决方案1】:

你不能像这样过滤吗?

DataContext.InscriptionEcole.Where(item => !otherList.Contains(item, customComparer));

查看包含 here 的文档

更新

需要的是非等连接:

DataContext.InscriptionEcole.Where(ecoleItem => 
    !keys.Any(key => 
        key.FkEleNumEleve == ecoleItem.FkEleNumEleve &&
        key.FkCllEcole == ecoleItem.FkCllEcole && ...));

【讨论】:

  • 类型不同。查询在 InscriptionEcole 上,列表包含 InscriptionEcoleKeys !!!
  • 好的,所以只需使用Where 而不是Contains 并检查结果的长度
  • 你能说明你的想法@Christian 吗?
  • 好吧,像DataContext.InscriptionEcole.Where(compositeKey => otherList.Where(key => KeysEquals(compositeKey, key)).Length == 0); 这样的东西我猜可以写得更简洁一点,比如DataContext.InscriptionEcole.Where(compositeKey => !otherList.Any(key => KeysEquals(compositeKey, key)));,其中 KeysEquals 根据您的需要比较各个集合中的项目是否相等。
  • 我认为您要查找的是非等值连接,请参阅 here 并查看 NonEquijoin() 示例。
猜你喜欢
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 2015-07-06
  • 2011-04-27
  • 1970-01-01
  • 2012-04-04
相关资源
最近更新 更多