我正在尝试找到可以在审计表上运行的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
答案 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));