【问题标题】:LINQ query operator for log table日志表的 LINQ 查询运算符
【发布时间】:2009-03-11 22:08:44
【问题描述】:

我正在尝试找到可对审计表进行操作的 corerct LINQ to SQL 查询运算符和谓词组合。

想象一个名为 Setting 的表,它包含三列:rowID、DefID 和 Value。

我希望能够检查每个 DefID(在本例中为所有定义 1 到 3)是否至少有一行的值设置为 true。

LINQ 表达式应返回布尔值 true 或 false。例如,

RowID    DefID    Value
1        1        true
2        2        false
3        3        true

LINQ 返回 false,因为 DefID = 2 没有任何值 = true

RowID    DefID    Value
1        1        true
2        2        false
3        2        true

返回 false,因为缺少 defid 3

RowID    DefID    Value
1        1        true
2        1        false
3        2        true
4        3        true

返回 true,因为所有定义都至少有一个值 = true

【问题讨论】:

  • 您需要更具体一些。例如,在第二个示例中,您如何知道在 DefID = 3 处停止?您的第三个示例中的 DefID = 4 不是“丢失”吗?
  • 我知道正好有3个定义; 1、2 和 3。所以我有我正在寻找的全套定义 ID。任何像 [1,2,3] 这样的整数数组都是可用的。
  • 您是否已经有 linq 查询来生成上述输出并且正在寻找添加到它以返回 true/false 的内容?还是您要整件事?
  • 我只是在寻找真假...我有“选择”查询重现上面的简化版本。

标签: linq


【解决方案1】:

这是一个使用扩展方法的例子:

int[] ids = new int[] { 1, 2, 3 };

bool allFound = Settings.Where( s => s.Value && ids.Contains( s.DefID ) )
                        .Select( s => s.DefID )
                        .Distinct()
                        .Count() == ids.Length;

【讨论】:

    【解决方案2】:

    我从未使用过 linq to sql,但 linq to objects 看起来像这样:

    defIds.All(d => d.rows.Any( row => row.Value == true ) )
    

    要在原始 SQL 中执行此操作,我认为不可能在一个查询中完成。不过你可以这样做:

    select id from DefIds
    join rows on row.DefId = DefIds.ID
    where row.Value = true
    

    这将为您提供具有真实值的 defId 列表。然后在代码中你可以做类似的事情

    DefIds.Select(d => d.id).ToArray() == (results from select).ToArray()
    

    【讨论】:

      【解决方案3】:

      嗯,有很多有效的方法可以做到这一点。一种简单的方法是:

      int[] DefIDs = new int[] {1, 2, 3};
      
      bool bHasValidDefs =
          (
          from set in myDataBase.settings
          where 
              set.Value == true
              && DefIDs.Contains(set.DefID)
          select set.DefID
          ).Distinct().Count() == DefIDs.Count();
      

      这会获取有效列表中唯一 DefID 的数量,并且至少有一个“value == true”行。然后确保这些有效 DefID 的数量等于您在上面定义的预期值。

      【讨论】:

        【解决方案4】:

        如果您可以使用 ValidSettings 或 SettingsMaster 表,您可以:

        bool allFound = myContext.SettingsMaster.All(m=> m.Settings.Any(s=>s.Value));
        

        对于当前的表格版本,我会

        int[] allIds = new int[] {1, 2, 3};
        var validIds = (
            from s in myContext.Settings 
            where s.Value 
            select s.DefId
            )
            .Distinct().ToList();
        bool allFound = allIds.All(id => validIds.Contains(id));
        

        【讨论】:

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