Допустим, у меня есть один метод, который извлекает имя и значение свойства:
public TModel Get (Expression<Func<object>> param)
{
using (OracleConnection connection = new OracleConnection(GetConnectionString()))
{
connection.Open();
var propertyName= ((MemberExpression)param.Body).Member.Name;
var value = param.Compile()();
// GetTableName() returns table name of TModel
var query = $"SELECT * FROM {GetTableName()} WHERE {propertyName}='{value}'";
var output = connection.Query<TModel>(query);
connection.Dispose();
return output.FirstOrDefault();
}
}
и использует его как:
var model = Get(() => foo.FirstProperty);
Однако, если я хочу получить имя и значение из неизвестного числа свойств я делаю это:
public TModel Get(params Expression<Func<object>>[] param)
using (OracleConnection connection = new OracleConnection(GetConnectionString()))
{
connection.Open();
var query = new StringBuilder();
query.Append($"SELECT * FROM {GetTableName()} WHERE ");
for (int i = 0; i < param.Length; i++)
{
var propertyName = ((MemberExpression)param[i].Body).Member.Name;
var value = param[i].Compile()();
query.Append($"{propertyName} = '{value}'");
if (i + 1 < param.Length) query.Append(" AND ");
}
var output = connection.Query<TModel>(query.ToString());
connection.Dispose();
return output.FirstOrDefault();
}
}
Но реализация выглядит немного «некрасиво» и многословно:
var model = Get(() => foo.FirstProperty, () => foo.SecondProperty); // and so on
Я мог бы отправить ручное имя свойства + значение, однако, я хотел бы сохранить реализацию как можно более простой и менее многословной.
Есть ли способ упростить это?