用于日志表的LINQ查询运算符

时间:2009-03-11 22:08:44

标签: linq

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

想象一下名为Setting的表有三列:rowID,DefID和Value。

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

LINQ表达式应返回bool true或false。例如,

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

LINQ返回false,因为DefID = 2没有任何value = 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,因为所有定义至少有一个value = true

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

我从来没有将linq用于sql,但对象的linq看起来像这样:

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()

答案 2 :(得分:0)

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

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的数量等于您在上面定义的预期值。

答案 3 :(得分:0)

如果你可以使用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));