c# 识别 sql uniqueidentifier

c# recognize sql uniqueidentifier

我有一个方法,我想根据输入的类型使用不同的方法。这是我的:

public static DataTable GetS(string source = null, string customer = null)
    {
        if (source != null && customer == null) 
        {
            return GetDataTableFromQuery("db.GetS", new object[] { "@source", source });
        }
        else if (source == null && customer != null)
        {
            return GetDataTableFromQuery("db.GetS", new object[] { "@customer", customer });
        }
        else
        {
            throw new Exception("Bad input. Call GetS with GetS(source) or GetS(null,customer).");
        }
    }

sp 看起来像这样:

CREATE PROCEDURE [db].[GetS]

    @source as nvarchar(128) = NULL,
    @customer as nvarchar(128) = NULL

AS
BEGIN
IF @customer IS NULL
BEGIN
    SELECT 
        *
    FROM 
        db.S
    WHERE
        [Source] = @source
END
IF @source IS NULL
BEGIN
    SELECT 
        * 
    FROM 
        db.S
    WHERE 
        customer = @customer
END

END

这适用于 GetS(source)GetS(null,customer) 但我有 2 个问题。

  1. 如果有人用 GetS(customer)
  2. 打电话,情况就会变糟
  3. 看起来不是很漂亮..

有没有办法做这样的事情(伪代码):

public static DataTable GetS(string input)
{
    if(input is sql-uniqueidentifier)
    {
        return GetDataTableFromQuery("db.GetS", new object[] { "@source", input});
    }
    else
    {
        return GetDataTableFromQuery("db.GetS", new object[] { "@customer", input]);
    }
}

或者有更好的方法吗? (当然,我可以制作 2 种不同的方法,但我想让它只使用一种 Get 方法。如果我制作 GetSBySource 或其他东西,感觉很奇怪)。

在你的情况下,为什么不写两个方法,这不是奇怪!!吗?我认为使用两种方法是最好的方法。

  1. public static DataTable GetSBySource(Guid source)
  2. public static DataTable GetSByCustomer(string customer)

这将使您的 API 方式更加实用和清晰。

如果您知道,有一次您需要它来传递 Uniqueidentifier,您也可以将其设为通用:

public static DataTable GetS<T>(string input)
{
    if(T is Guid)
    {
        return GetDataTableFromQuery("db.GetS", new object[] { "@source", input});
    }
    else
    {
        return GetDataTableFromQuery("db.GetS", new object[] { "@customer", input]);
    }
}

但是你也应该让你的输入通用,因为将 Guids 作为 strings 传递,并不是很好...

使用错误的方法定义,在更改代码时会导致很多问题。例如,您需要将一个 Guid 传递给该方法,该方法只接受字符串,而不是重构或更改代码将非常困难。此外,方法的定义,应该描述它的用法...