Filtrado de datos sobre la base de los valores de atributo -- # campo con performance campo con linq camp codereview Relacionados El problema

Filtering data on basis of attribute values


0
vote

problema

Español

Estoy escribiendo código para filtrar los datos sobre la base de los valores de atributos. Es posible que el usuario pueda seleccionar varios valores.

¿Cómo puede ser esto mejor?

  Number5  

Modelo de vista de filtro:

  Number6  
Original en ingles

I am writing code to filter data on basis of attribute values. It is possible that the user can select multiple values.

How can this be better?

Models.Products filter(ViewModel.Filter search,IEnumerable<Models.Products> product) {     if (search.filter!= null && search.filter.Count>0)         {              var f = search.First();              var tempProducts = products                                .Where(c => c.productattributes                                             .Where(a => a.AttributeId == f.Id && f.Value.Contains(a.Value))                                             .Any());              search.filter.Remove(f);              foreach (var fs in search)              {                 var p = products.Where(c => c.productattributes.Where(a => a.AttributeId == fs.Id && fs.Value.Contains(a.Value)).Any());                 tempProducts = tempProducts.Union(p);              }              products = tempProducts;         } } 

Filter View Model:

public class Filters {     public long Id { get; set; }      public IEnumerable<string> Value { get; set; } } 
        
 
 

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Su código parece estar incompleto, pero he proporcionado algunas ideas a continuación.

Clase de filtros

Estoy mirando a su clase de filtros:

  public class Filters {     public long Id { get; set; }     public IEnumerable<string> Value { get; set; } }   

De esto, asumo que el propósito de esto es mantener la ID de atributo (clave) y las palabras clave de búsqueda (valor). Entonces, le propondría que solo use un 9988776665544335 - Tenga en cuenta que cambié el tipo de palabras clave de búsqueda a una lista, ya que no veo ninguna razón dentro de su ejemplo de código en cuanto a por qué debería / debería necesita ser un tipo IEnumberable .

Eso cambiaría entonces el método:

  • Método renombrado
  • Parámetro actualizado para usar Dictionary en su lugar (por encima)

Aquí está el método actualizado

  public IEnumerable<Product> FilterProductsByAttributeId(     Dictionary<long, List<string>> filters,     IEnumerable<Product> products) {     // your method contents here }   

Método de filtro

No estoy seguro de por qué tiene un inicializador complicado para su tempProducts , ¡pero tal vez pueda mejorarse con algo como este?

  charAt0  

Alternativamente, puede usar el charAt1 extensión:

  charAt2  
 

Your code appears to be incomplete but I've provided some ideas below.

Filters Class

I'm looking at your Filters class:

public class Filters {     public long Id { get; set; }     public IEnumerable<string> Value { get; set; } } 

From this, I am assuming that the purpose of this is to hold the Attribute Id (key) and Search Keywords (value). So, I would propose you just use a Dictionary<long, List<string>> -- note that I changed the type of your Search Keywords to a List as I am not seeing any reason within your code example as to why it should/would need to be an IEnumberable type.

That would then change the method:

  • Method renamed
  • Parameter updated to use Dictionary instead (per above)

Here is the updated method

public IEnumerable<Product> FilterProductsByAttributeId(     Dictionary<long, List<string>> filters,     IEnumerable<Product> products) {     // your method contents here } 

Filter Method

I'm not sure why you have a complicated initializer for your tempProducts, but maybe it can be improved to something like this?

public IEnumerable<Product> FilterProductsByAttributeId(Dictionary<long, List<string>> filters, IEnumerable<Product> products) {     if (products == null) throw new ArgumentNullException(nameof(products));     if (filters == null) throw new ArgumentNullException(nameof(filters));      IEnumerable<Product> result = new List<Product>();     foreach (var f in filters)     {         result = result.Union(products.Where(p => p.ProductAttributes             .Where(a => a.AttributeId == f.Key && f.Value.Contains(a.Value)).Any()));     }      return result;     } 

Alternatively you can use the Aggregate extension:

return      filters         .Aggregate(             new List<Product>(),              (current, next) => current.Union(..)         ); 
 
 
   
   

Relacionados problema

4  Paginado IEnumerable <T> secuencia  ( Paginate ienumerablet sequence ) 
Usé lo siguiente para dividir la secuencia en lotes: source .Select((item, index) => new {Item = item, Index = index}) .ToLookup(x => x.Index / bat...

5  Código conciso para realizar la acción en cada elemento, cuando necesita índice  ( Concise code to perform action on every element when need index ) 
Cuando leí esta respuesta , que tiene código: linqObject.Where((obj, index) => { DoWork(obj, index); return true; }).ToArray(); //MUST CALL ToArray() ...

6  Tomar n elementos de la lista de listas  ( Take n elements from list of lists ) 
He venido con una solución súper complicada por un requisito simple. Creo que podría resolver el problema usando LINQ, pero no lo estoy viendo tan claramente....

2  Obtén el primer patrimonio dado por los días de semana y un tiempo de inicio  ( Get first datetime by given weekdays and a starttime ) 
En el trabajo hay un sistema de entrada donde los clientes pueden especificar los días de semana y una hora de inicio para un evento. Los días de semana son e...

3  Insertar y actualizar el registro utilizando LINQ llamando a una función común  ( Inserting and updating record using linq by calling a common function ) 
Tengo una función llamada InserUpdateRecords(int flag) a la que paso la variable entera que indica el tipo de operación que tiene que realizar, si 99887776...

7  Versión LINQ del algoritmo de recocido simulado  ( Linq version of the simulated annealing algorithm ) 
Decidí intentarlo e implementar (una versión de) la recocido simulado algoritmo usando solo linq , solo para ver si pudiera. Me encantaría si alguien pudi...

5  Cachill genérico IEnumerable <T>  ( Generic cached ienumerablet ) 
Tengo una fuente 9988776655544330 que lleva tiempo para generar cada elemento. Una vez que se genera un artículo, quiero cambiarlo para evitar la recompensa...

5  Consulta de grupo LINQ - Simplificando  ( Linq group query simplifying ) 
¿Hay alguna forma de escribir esta consulta de trabajo correctamente de manera más eficiente? Solo estoy pidiendo aprender mejor linq: n0 ...

81  Sundokusharp Solver con características avanzadas  ( Sudokusharp solver with advanced features ) 
Aunque es la primera vez que escribo algo "grande", se siente como si conozco C # bastante bien (es muy similar a Java después de todo). Ha sido bueno aprende...

6  Uso de LINQ para realizar una únete al exterior de la izquierda en 2 datos de datos (criterios múltiples)  ( Using linq to perform a left outer join in 2 datatables multiples criteria ) 
Sé que existe muchas soluciones sobre cómo crear un OUTER JOIN entre dos DataTables . He creado el siguiente código en C #: DataTable vDT1 = new DataT...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos