Я сделал что-то подобное с хранимой процедурой один раз. По сути, я хотел указать любую перестановку полей для сопоставления в моем предложении WHERE, но я не хотел писать 100 sprocs с немного другими списками параметров и операторами 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;
}
EDIT:
В ответ на комментарий:
Вы можете достаточно легко изменить GetSimpleCustomers на DeleteSimpleCustomers, изменив
SELECT <columns> FROM SimpleCustomers
до
DELETE FROM SimpleCustomers
и придерживайтесь той же логики. То же самое верно для обновления.
Также я отвечу на вопрос вопросом: сколько у вас таблиц, которые действительно нуждаются в этом уровне пользовательской фильтрации? Синтаксис будет таким похожим, что вы сможете все это вычислить за день (или меньше, если вы соберете вместе простой скрипт, чтобы написать его для вас).