我曾经用存储过程做过类似的事情。基本上,我想在 WHERE 子句中指定要匹配的任何字段排列,但我不想编写 100 个参数列表和 where 子句略有不同的存储过程。
所以,我做了这样的事情:
CREATE PROCEDURE [GetSimpleCustomers]
(
@ID varchar(50) = null,
@Name varchar(50) = null,
@IsActive bit = null,
@Address1 varchar(50) = null,
@Address2 varchar(50) = null,
@City varchar(50) = null,
@State varchar(50) = null,
@Zip varchar(50) = null
)
AS
SELECT ID, Name, IsActive, Address1, Address2, City, State, Zip
FROM SimpleCustomerExample
WHERE (ID = @ID OR @ID is NULL)
AND (Name = @Name OR @Name is NULL)
AND (IsActive = @IsActive or @IsActive is NULL)
AND (Address1= @Address1 or @Address1 is NULL)
AND (Address2= @Address2 or @Address2 is NULL)
AND (City= @City or @City is NULL)
AND (State= @State or @State is NULL)
AND (Zip= @Zip or @Zip is NULL)
这将让您在代码中调用 sproc 并只传递您有兴趣过滤的参数,如果您将它们留空,其余的将不会被考虑在内。
所以,你可以做类似的事情
public List<SimpleCustomer> GetAllCustomersFromOhio()
{
List<SimpleCustomer> list = new List<SimpleCustomer>();
using (SqlCommand cmd = new SqlCommand(blah blah))
{
cmd.Parameters.AddWithValue("State", "Ohio");//or "OH" depending on your convention
using(IDataReader oDR = cmd.ExecuteReader())
{
//hydrate your list of SimpleCustomers from the record set.
}
}
return list;
}
编辑:回复评论:您可以通过更改 GetSimpleCustomers 很容易地更改为 DeleteSimpleCustomers
SELECT <columns> FROM SimpleCustomers
到
DELETE FROM SimpleCustomers
并保持相同的逻辑。更新也是如此。另外,我将用一个问题来回答一个问题:您有多少表实际上需要这种级别的自定义过滤?语法将非常相似,您可以在一天内完成所有操作(如果您拼凑一个简单的脚本为您编写它,则更少)。