Asp.net web api 如何从WebAPI获取参数,以便在SQL查询中使用它们

Asp.net web api 如何从WebAPI获取参数,以便在SQL查询中使用它们,asp.net-web-api,Asp.net Web Api,因此,我使用本指南设置了一个使用SQL的WebAPI: 这一切都很好,但我注意到这只是从SQL中提取所有记录,并在C中执行Where,这对于我的数百万行的数据库来说并不理想 我认为应该有效的快速解决方案是在此处捕获参数: public IEnumerable<ConfigMgrServerDB> GetByStateOrProvince(string StateOrProvince) { Debug.WriteLine(StateOrProvince

因此,我使用本指南设置了一个使用SQL的WebAPI:

这一切都很好,但我注意到这只是从SQL中提取所有记录,并在C中执行Where,这对于我的数百万行的数据库来说并不理想

我认为应该有效的快速解决方案是在此处捕获参数:

    public IEnumerable<ConfigMgrServerDB> GetByStateOrProvince(string StateOrProvince)
    {
        Debug.WriteLine(StateOrProvince);
        APIparam = StateOrProvince;
        return customerAddressData;
    }
但是,即使我在类的作用域中定义了APIparam,当我尝试在调用SQL的方法中使用它时,它显然没有值,发送到SQL的参数设置为“default”,如下所示: ,@param=默认值 下面是完整的代码,它表明APIparam定义为一个公共字符串,可以很好地进行设置和回显。但是,当我想在SQL代码中使用它时,它的值为null

        using System;
        using System.Collections.Generic;
        using System.Data;
        using System.Data.SqlClient;
        using System.Diagnostics;
        using System.Linq;
        using System.Web;

        namespace WebApplication4.Models
        {
            public class ConfigMgrServerDBRepository : IConfigMgrServerDBRepository
            {
                private readonly List<ConfigMgrServerDB> customerAddressData = new List<ConfigMgrServerDB>();

                public string APIparam ;
                public string strProgramName;

                public int GetCount()
                {
                    return customerAddressData.Count;
                }

                public IEnumerable<ConfigMgrServerDB> GetByStateOrProvince(string StateOrProvince)
                {
                    Debug.WriteLine(StateOrProvince);
                    APIparam  = StateOrProvince;
                    return customerAddressData;
                }

                public IEnumerable<ConfigMgrServerDB> GetAll()
                {
                    return customerAddressData;
                }

                public ConfigMgrServerDB Add(ConfigMgrServerDB item)
                {
                    if (item == null)
                    {
                        throw new ArgumentNullException("item arg was null");
                    }
                    if (customerAddressData != null) customerAddressData.Add(item);
                    return item;
                }

                public ConfigMgrServerDBRepository()
                {
                    using (var conn = new SqlConnection(
                        @"Data Source=RE8-PRIMB\PRIMB;Initial Catalog=PrimB;Persist Security Info=True;User ID=sa;Password=pass;"))
                        //@"Data Source=RE8-NWMMC1\NWMMC1;Initial Catalog=AdventureWorksLT2012;Persist Security Info=True;User ID=sa;Password=pass;"))
                    {
                        using (var cmd = conn.CreateCommand())
                        {
                            cmd.CommandText =
        @"CREATE TABLE #Package
        (
            PackageID NVARCHAR(8),
            Name NVARCHAR(512),
            ProgramName NVARCHAR(100),
            CollectionID NVARCHAR(8),
        )
        CREATE CLUSTERED INDEX IDX_C_Package_CollectionID ON #Package(CollectionID)

        INSERT INTO #Package
        SELECT Pa.[PackageID],Pa.[Name],MAX(Pro.Name)ProgramName, A.CollectionID
        FROM v_Package (nolock) Pa
        INNER JOIN vSMS_Program (nolock) Pro ON Pro.PkgID = Pa.PackageID AND (ProgramFlags&0x00001000)/0x00001000 <> 1
        INNER JOIN v_Advertisement (nolock) A ON A.PackageID = Pa.PackageID AND A.ProgramName = Pro.Name
        WHERE Pa.PackageType = 0 AND Pro.Name <> '*' /*AND Pro.Name NOT LIKE '%Nomad%'*/
        GROUP BY Pa.PackageID,Pa.Manufacturer,Pa.[Name],Pa.[Description], A.CollectionID

        SELECT p.PackageID, p.ProgramName/*, p.Name, cm.Name MachineName,s.Hardware_ID0,mac.MAC_Addresses0*/
        FROM #Package p
        INNER JOIN CollectionMembers (nolock) cm ON cm.SiteID = p.CollectionID
        INNER JOIN v_R_System_Valid (nolock) s ON s.ResourceID = cm.MachineID
        INNER JOIN v_RA_System_MACAddresses (nolock) mac ON mac.ResourceID = s.ResourceID
        WHERE cm.Name = @PackageID
        OR mac.MAC_Addresses0 = '78:2B:CB:9B:56:F3'
        GROUP BY p.PackageID,p.Name, p.ProgramName";

                            cmd.CommandType = CommandType.Text;
                            //cmd.Parameters.AddWithValue("@PackageID", APIparam );
                            cmd.Parameters.AddWithValue("@PackageID", "RE8-W7-1");
                            Debug.WriteLine(APIparam);

                            cmd.Connection.Open();
                            using (SqlDataReader dataReader = cmd.ExecuteReader())
                            {
                                while (dataReader != null && dataReader.Read())
                                {
                                    int i = 0;
                                    while (dataReader.Read())
                                    {
                                        i++;
                                        APIparam  = Convert.ToString(dataReader["PackageId"]);
                                        strProgramName = Convert.ToString(dataReader["ProgramName"]);
                                        Add(new ConfigMgrServerDB { PackageId = APIparam , ProgramName = strProgramName });

                                    }
                                    if (i == 0) /* No Rows */
                                    {
                                        //collectionMessage = "Cannot add Machine to collection  " + CMCollectionID + " because no CM resource found with this serial number" + System.Environment.NewLine;
                                        Debug.WriteLine("no rows ");
                                    }                         

                                }
                            }
                        }
                    }
                }
            }
        }

什么是APIparam?如何使用它来构造查询?让我通过编辑将整个类发布给您。第一个Debug.writeListateOrProvince;打印出我的参数很好。第二个没有,看起来我分配APIparam的代码实际上是在SQL命令之后运行的。因此,我需要找到另一种方法来获取SQL命令的API参数。我刚刚通过更改Debug.writelineApparam发现了这一点;如果String.isnulloremptyaparam Debug.WriteLineis为null或为空,则输入到中;现在,我的调试控制台显示:如果是null或空的r1122Right,它看起来像是在类构造函数中调用了debug.WriteLineApparam。那么它是如何获取参数的呢?不幸的是,WebAPI和SQL的所有在线示例都采用这种方法,但必须有另一种方法。