将静态参数转换为数组并与lambda WHERE一起使用

时间:2019-01-04 22:33:24

标签: c#

编辑:此问题不是Converting a datetime object to an integer python的重复。 我正在寻找一种方法,可以为n个键值参数和相关的where子句传递Hashtable,数组或某些基于集合的方法。

我有3种重载方法:

public static bool DoesRecordExist(string keyColumn, string keyValue, DataTable dt) {
 if (dt != null && dt.Rows.Count > 0) {
  bool exists = dt.AsEnumerable().Where(r => string.Equals(SafeTrim(r[keyColumn]), keyValue, StringComparison.CurrentCultureIgnoreCase)).Any();
  return exists;
 } else {
  return false;
 }
}

public static bool DoesRecordExist(string keyColumn1, string keyColumn2, string keyValue1, string keyValue2, DataTable dt) {
 if (dt != null && dt.Rows.Count > 0) {
  bool exists = dt.AsEnumerable().Where(r => string.Equals(SafeTrim(r[keyColumn1]), keyValue1, StringComparison.CurrentCultureIgnoreCase) && string.Equals(SafeTrim(r[keyColumn2]), keyValue2, StringComparison.CurrentCultureIgnoreCase)).Any();
  return exists;
 } else {
  return false;
 }
}

public static bool DoesRecordExist(string keyColumn1, string keyColumn2, string keyColumn3, string keyValue1, string keyValue2, string keyValue3, DataTable dt) {
 if (dt != null && dt.Rows.Count > 0) {
  bool exists = dt.AsEnumerable().Where(r => string.Equals(SafeTrim(r[keyColumn1]), keyValue1, StringComparison.CurrentCultureIgnoreCase) && string.Equals(SafeTrim(r[keyColumn2]), keyValue2, StringComparison.CurrentCultureIgnoreCase) && string.Equals(SafeTrim(r[keyColumn3]), keyValue3, StringComparison.CurrentCultureIgnoreCase)).Any();
  return exists;
 } else {
  return false;
 }
}

所有这些都按预期工作,并且您可以看到,所有3个都是相同的,只是参数的数量和相应的where子句参数不断增加。现在,我需要添加具有5个键/值对的另一个重载。显然,这越来越傻了。

如何将所有这些重载转换为一个函数,只需在其中传递Hashtable的键值对(或其他具有同等或更好意义的集合)?

谢谢。

1 个答案:

答案 0 :(得分:-1)

您可以使用带有Dictionary<string, string>参数的扩展方法来做到这一点:

public static class Extensions
{
    public static bool DoesRecordExist(this DataTable dt, Dictionary<string, string> KeysAndValues)
    {
        if (dt != null && dt.Rows.Count > 0)
        {
            var rows = dt.AsEnumerable();
            foreach (var key in KeysAndValues.Keys)
            {
                rows = rows.Where(row => string.Equals(row[key], KeysAndValues[key], StringComparison.CurrentCultureIgnoreCase));
            }
            return rows.Any();
        }
        else
        {
            return false;
        }
    }
}

然后您可以像这样使用:

var keysAndValues = new Dictionary<string, string>();
keysAndValues.Add("FirstName", "John");
keysAndValues.Add("LastName", "Doe");
var dt = ... // your DataTable
Console.WriteLine(dt.DoesRecordExist(keysAndValues));

或带有初始化程序:

var keysAndValues = new Dictionary<string, string>()
{
    { "FirstName", "John"} ,
    { "LastName", "Doe" }
};
var dt = ... // your DataTable
Console.WriteLine(dt.DoesRecordExist(keysAndValues));

最后,您可能需要使用row[key].ToString()row[key] as string而不是row[key]