代码之家  ›  专栏  ›  技术社区  ›  Mark Roworth

构建MS SQL构造IN的C#等价物?

  •  1
  • Mark Roworth  · 技术社区  · 1 年前

    在SQL Server中,我经常使用 IN 检查某个值是否在项目列表中,例如:

    WHERE @x IN (1, 2, 3, 5, 8, 13)
    

    通过在库函数中定义以下内容,我已经尽可能地接近了:

    public static bool IIN(object oValue, params object[] oValues)
    {
        int i;
    
        for (i = 0; i <= oValues.GetUpperBound(0); i++)
        {
            if ((oValue.ToString()) == (oValues[i].ToString())) 
               return true;
        }
    
        return false;
    }
    

    我可以这样调用该函数:

    bool bItemFound = IIN(x, 1, 2, 3, 5, 8, 13);
    

    然而,由于它在图书馆里,我最终不得不参考图书馆,因此:

    bool bItemFound = MyProject.Common.Helpers.CoreHelper.IIN(x, 1, 2, 3, 5, 8, 13);
    

    这确实使代码变得混乱。我尝试在调用类的顶部声明一个lambda函数:

    Func<object, params object[], bool> IIN = (a, b) => { return MyProject.Common.Helpers.CoreHelper.IIN(a, b); };
    

    但是lambda声明似乎不喜欢使用param数组。我可以将b参数设置为对象数组,因此:

    public static bool IIN2(object oValue, object[] oValues)
    {
        int i;
    
        for (i = 0; i <= oValues.GetUpperBound(0); i++)
            if ((oValue.ToString()) == (oValues[i].ToString())) 
               return true;
    
        return false;
    }
    

    我的lambda声明是:

    Func <object, object[], bool> IIN = (a, b) => { return CoreHelper.IIN2(a, b); };
    

    但随后我必须在调用代码中声明一个内联一次性对象[]:

    bool bItemFound = IIN(x, new object[] { 1, 2, 3, 5, 8, 13 });
    

    有没有一种更整洁的方法来做到这一点,像SQL等价物一样干净易读?

    2 回复  |  直到 1 年前
        1
  •  2
  •   David    1 年前

    这确实使代码变得混乱。

    如果唯一的目标是删除此部分:

    MyProject.Common.Helpers.CoreHelper.
    

    然后a using static 指令可以做到这一点。例如,如果在文件顶部包含此指令:

    using static MyProject.Common.Helpers.CoreHelper;
    

    然后,您可以直接调用该方法:

    bool bItemFound = IIN(x,1,2,3,5,8,13);
    

    我没有测试过这个,但你 也许 甚至能够将其与 global using C#10中的指令:

    global using static MyProject.Common.Helpers.CoreHelper;
    

    这应该允许在项目中包含的整个文件中使用该方法。

        2
  •  0
  •   Mark Roworth    1 年前

    问这个问题对我有帮助。我想到的最好的办法是写一个扩展类,如下:

    public static class IntExtension
    {
        public static bool IsIn(this int x, params int[] values)
        {
            for (int i = 0; i < values.GetUpperBound(0); i++)
                if (values[i] == x) return true;
            return false;
        }
    }
    

    我可以这样称呼它:

    bool bItemFound = iMsgType.IsIn(1,2,3,5,8,13);
    

    这对我来说已经足够好了。我们非常欢迎其他解决方案。