Advertisement
rfog

Untitled

Jan 6th, 2022
932
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.55 KB | None | 0 0
  1. Hola.
  2.  
  3. A ver si consigo explicarme. Me he hecho cargo de un proyecto que tiene varios DataContext que a su vez contienen varias tablas, todo ello construido sobre un DBML con LINQ to SQL.
  4.  
  5. Para acceder al contexto, genero una instancia al mismo mediante la cadena de conexión, y luego uso LINQ sobre la tabla que me interesa. Hasta ahí todo normal. El problema que tengo es que todas las tablas dentro del DataContext son iguales, solo cambia el nombre. Es decir, dentro tengo Tabla01Cosa, Tabla02Cosa, Tabla03Cosa, ... (no hace falta que me digáis lo mal que está construido eso, pero es lo que tengo y no tengo tiempo de refactorizar mucho).
  6.  
  7. El código que he recibido realiza la misma operación sobre todas las tablas, con el mismo código pero cambiando la tabla:
  8.  
  9.     var result = from context.Tabla01Cosa...
  10.  
  11. Para actualizar se hace lo mismo: se crea una entidad, se actualiza y se escribe con InsertOrSumbit().
  12.  
  13. En este momento hay 24 tablas, pero podría haber hasta 100 (de nuevo no hace falta que me digáis nada, ya sé lo lo chapucero que es eso). Y por supuesto, cada método ronda entre 2000 y 10.000 líneas de código, repitiendo exactamente lo mismo pero cambiando la tabla.
  14.  
  15. Mi idea, aparte de usar el DataContext con SQL directamente, que no me mola porque tiende a generar errores que solo se van a descubrir en tiempo de ejecución, es obtener la tabla por reflexión y ejecutar el LINQ para cada una de esas tablas.
  16.  
  17. Hasta ahora he obtenido la tabla, pero como objeto:
  18.  
  19.     var table = myDb.GetType().GetProperty($"Tabla{tableNumber:D2}Cosa")?.GetValue(myDb, null)
  20.    
  21. Pero table es Object, no Table<TEntity>, que es lo que da opción a ejecutar LINQ.
  22.  
  23. La idea es entonces convertirlo a dicho, al menos Table<TEntity>. Pero las tablas no son realmente Table<TEntity>, sino que es una clase que hereda de INotifyPropertyChanging y de INotifyPropertyChanged, entonces, lo que realmente tengo que obtener es esto:
  24.  
  25.     var temp = myDb.GetType().GetProperty($"Tabla{tableNumber:D2}Cosa")?.GetValue(myDb, null);
  26.     var tipo = temp.GetType();
  27.     var table = temp as Table<tipo>;
  28.    
  29. Que evidentemente no compila.
  30.  
  31. Todo ello ha de ser dinámico respecto a cada tabla dentro del dbml.
  32.  
  33. Finalmente, la idea es ejecutar la misma operación sobre cada una tabla a partir de un array de objetos que se corresponden con cada una de esas tablas.
  34.  
  35. He probado a moldearlo a IEnumerable, por ejemplo, pero luego parece ser que LINQ no sabe qué tabla es y lo que realmente necesita es saber que es Tabla01Cosa, Tabla02Cosa, etc..
  36.  
  37. ¿Hay alguna manera de hacerlo?
  38.  
  39.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement