Usted puede utilizar especificación dinámica y dinámico ordenando He blogueado sobre ellos here y here. A continuación debería ayudar ejemplo You-
//Assume you're getting following values from search form.
string userSuppliedProperty = "AverageRating";
OperationType userSuppliedOperationType = OperationType.GreaterThan;
var userSuppliedValue = 4.5;
//Create DynamicSpecification from these properties and pass it to repository.
var userFilter = new DynamicSpecification<Product>(userSuppliedProperty, userSuppliedOperationType, userSuppliedValue);
var filteredProducts = _repository.Get(userFilter);
//You can also combine two specifications using either And or Or operation
string userSuppliedProperty2 = "Category";
OperationType userSuppliedOperationType2 = OperationType.EqualTo;
var userSuppliedValue2 = "Keyboard";
var userFilter2 = new DynamicSpecification<Product>(userSuppliedProperty2, userSuppliedOperationType2, userSuppliedValue2);
var combinedFilter = userFilter.And(userFilter2);
var filteredProducts2 = _repository.Get(combinedFilter);
//and it support dynamic sorting
string userSuppliedOrderingProperty = "Category";
OrderType userSuppliedOrderType = OrderType.Ascending;
var sortedFilteredProducts = _repository.Get(combinedFilter, o => o.InOrderOf(userSuppliedOrderingProperty, userSuppliedOrderType));
No sé acerca de la búsqueda de objetos/DTO que está recibiendo, pero se puede crear fácilmente una búsqueda genérica objeto/DTO y puedo asignarlo a la cadena de objetos de GenericSpecification en pocas líneas de código. Lo he usado en el pasado en torno a un servicio de WCF y me ha funcionado muy bien.
Gracias, pero ¿cómo funciona esto? ¿Esto no extrae todos los datos de la base de datos y luego, paso a paso, lo reduce al conjunto de datos deseado? – Eduard
@ t-edd: No, aprovecha 'ejecución diferida' (http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx). Eso significa que 'IQueryable' que se compone en el ejemplo anterior es solo una expresión de consulta que describe cómo se filtran los datos. La ejecución real de la consulta no está en el ejemplo en absoluto. Entonces ejecuta la consulta aplicando un operador "codicioso" a 'IQueryable ', por ejemplo 'query.ToList()'. En este punto, y no antes, la expresión de consulta se traduce a SQL y se envía al servidor. –
Slauma
No es tan bueno porque asume que 'SomeEntity' tiene campos Name y Quantity, por lo que esto es solo mitad dinámico. –