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

时间:2011-07-12 14:27:16

标签: c# .net linq

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

我正在使用

        //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<串GT; and 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查询中抛出异常吗?

提前谢谢你, 詹姆斯。

2 个答案:

答案 0 :(得分:2)

您期望抛出什么异常?我觉得你更好地获取结果并抛出你想抛出的异常:

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

*更新*

基于你的评论,基本上你有几个选择。我们可以把一个选择条款搞糊涂,但是我不喜欢这个,因为它在投影中感觉有点奇怪。可悲的是,Linq还没有ForEach()可以让您执行Action<T>,因此您可以为ForEach()编写自己的IEnumerable<T>,也可以使用{{1}将序列转换为具有ToList()的<{1}}:

List<T>

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

ForEach()

您可以执行此操作而不是使用 sqlcmdAll.Parameters.Cast<SqlParameter>().ToList().ForEach(p => { if (!l_sDatabaseFieldNames.Contains(p.SourceColumn)) { throw new Exception("Could not find " + p.SourceColumn); } });

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;
    }
}

答案 1 :(得分:2)

您可以选择第一个不匹配的参数

SqlParameter sqlp = sqlcmdAll.Parameters.Cast<SqlParameter>().Where(param => !l_sDatabaseFieldNames.Contains(param.SourceColumn)).FirstOrDefault();

if (sqlp != null)
    throw new Exception(string.Format("Transform field {0} does not have a corresponding column in the target table.", sqlp.SourceColumn));