gpt4 book ai didi

c# - 使用 linq 进行验证/抛出异常

转载 作者:行者123 更新时间:2023-11-30 21:13:48 24 4
gpt4 key购买 nike

这可能是错误的做事方式(!),但我只是想知道......

我正在使用

        //check that all transform fields have corresponding database columns
foreach (string sDatabaseFieldName in l_sDatabaseFieldNames)
{
bool bFound = false;
foreach (SqlParameter sqlp in sqlcmdAll.Parameters)
{
if (sqlp.SourceColumn == sDatabaseFieldName) bFound = true;
}
if (!bFound)
{
throw new Exception(string.Format("Transform field {0} does not have a corresponding column in the target table.", sDatabaseFieldName));
}
}

其中 l_sDatabaseFieldNames 是一个 List ,而 sqlcmdAll 是一个带有经过验证的参数名称的插入 SqlCommand。

如果 l_sDatabaseFieldNames 中的项目不在任何 sqlcmdAll.Parameters.SourceColumn 中,我想抛出异常。换句话说,l_sDatabaseFieldNames 中包含的所有列名也应该有一个匹配的参数(与使用 SourceColumn 属性相比)。

我也可以用

bool bFound = l_sDatabaseFieldNames.All(sDBFN => sqlcmdAll.Parameters.Cast<SqlParameter>().Any(param => sDBFN == param.SourceColumn));

但我只得到真/假结果。

如果项目在 l_sDatabaseFieldNames 中,但不在任何 sqlcmdAll.Parameters.SourceColumn 中,我能否结合使用这两种技术并从 linq 查询中抛出异常?

先谢谢你,詹姆斯。

最佳答案

您希望它抛出什么异常?我觉得这对您来说最好是获取结果并抛出您想要抛出的异常:

if (!l_sDatabaseFieldNames.All(sDBFN => sqlcmdAll.Parameters.Cast<SqlParameter>().Any(param => sDBFN == param.SourceColumn)))
{
throw new YourCustomException("Your custom message");
}

当然,如果这仅用于调试目的以验证测试中的条件并且您不需要它进入实际的发布代码,您可以使用断言:

Debug.Assert(l_sDatabaseFieldNames.All(sDBFN => sqlcmdAll.Parameters.Cast<SqlParameter>().Any(param => sDBFN == param.SourceColumn)));

* 更新 *

根据您的评论,基本上您有几个选择。我们可以混用一个 select 子句,但我不喜欢这样,因为投入投影感觉有点奇怪。遗憾的是 Linq 还没有 ForEach()让你执行 Action<T> , 所以你可以自己写 ForEach()对于 IEnumerable<T> ,或者您可以使用 ToList()将序列转换为 List<T>它确实有一个 ForEach() :

        sqlcmdAll.Parameters.Cast<SqlParameter>().ToList().ForEach(p =>
{
if (!l_sDatabaseFieldNames.Contains(p.SourceColumn))
{
throw new Exception("Could not find " + p.SourceColumn);
}
});

如果您不介意编写自己的扩展方法,您可以将其添加到您的库中(非常方便)以将 ForEach() 提供给 IEnumerable:

public static class EnumerableExtensions
{
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source,
Action<T> action)
{
if (source == null) throw new ArgumentNullException("source");

foreach (T element in source)
{
action(element);
}

return source;
}
}

哪个可以让你这样做而不是使用 ToList() :

        sqlcmdAll.Parameters.Cast<SqlParameter>().ForEach(p =>
{
if (!l_sDatabaseFieldNames.Contains(p.SourceColumn))
{
throw new Exception("Could not find " + p.SourceColumn);
}
});

关于c# - 使用 linq 进行验证/抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6665784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com