¿Cómo realizar un join entre 2 base de datos distintas con entity framework y LINQ? C# #linq

No es bueno para el rendimiento hacer este tipo de consultas ya que las tablas están en bases de datos distintas, pero muchas veces es necesario para el hecho de crear un reporte, o cuando se expande un sistema con nueva tecnología y al final el cliente desea un reporte combinado entre sus sistemas viejos y los nuevos, yo les mostrare una manera de poder lograr un join entre dos bases de datos distintas.
El problema es el siguiente(es hipotético no necesariamente es real solo sirve para el ejemplo), tenemos una base de datos (BD1) con las ventas diarias guardadas en una tabla llamada ventas, se nos pide que sea mostrada la venta y a su lado los datos del domicilio de la tienda, pero nos damos cuenta que no contamos con esos datos, esos datos están en una tabla llamada tienda en una base de datos distinta (BD2), entonces necesitamos hacer un join entre las 2 bases de datos, y para hacerlo debemos tomar a consideración lo siguiente:
Debemos evaluar cual tabla tiene menos registros ya que haremos primero la consulta sobre esa tabla primero y esos datos los tendremos en memoria. En este caso la tabla tienda es la que tiene menos datos (una tienda tiene muchas ventas así que el universo es menor por sentido común). Así que primero vamos por las tiendas de la siguiente forma:

//creamos nuestro contexto de la bd2 ya que ahi esta la tabla tienda
var db2= new entitiesTiendaDB();
//obtenemos las tiendas con una consulta simple de linq
var lstTiendas = from d in db2.tiendas.ToList()
                  select d;

Ahora que a tenemos las tiendas, de la siguiente manera hacemos el join con los datos que ya tenemos en la variable lstTienda:


//creamos el contexto de db1 el cual contiene la tabla ventas
var db = new entitiesVentasDB();

//teniendo un viewmodel llamado VentasViewModel el cual tenga solo los campos que necesitamos creamos la consulta
List<VentasViewModel> lst= from d in db.ventas.ToList()
                          //nuestra tienda se une por el campo codigTienda de lstTiendas y por el mismo campo en
                          //la tabla ventas
                          join t in lstTiendas on d.codigoTienda equals t.codidoTienda into un
                          //esto hace que sea un left join,
                          // si no ponen esto solo les regresara todo como inner join
                          from x in un.DefaultIfEmpty()
                          orderby t.nombreTienda
                     select new VentasViewModel
                      {
                          idTienda = (x!=null) ? x.id : 0, //como hicimos left join podría haber datos nullos y debemos evaluar
                          nombreTienda =(x!=null) ? x.nombre : "",
                          domicilioTienda =(x!=null) ? x.domicilio : "", //asi obtenemos el domicilio
                          codigo = (x!=null )? x.codigoTienda : "",
                          total= d.total //este viene en ventas así que accedo con d
                          subtotal=d.subtotal //igual que arriba

                      };

Y así se hace la magia. Dudas en los comentarios.

¿Cómo convertir una cadena XML a Objeto en c#? deserializar

Existen varias formas de llenar un objeto por medio de valores incrustados en XML(deserialización) y esta que planteo a continuación es la forma más comprensible de hacerlo.
Teniendo el siguiente texto de xml:


<padre>
  <hijo>
    <id>18</id>
    <valor>CFE7785</valor>
    <entero>1</entero>
  </hijo>
<padre>

Primero tenemos que hacer un conjunto de clases las cuales nos ayudaran a guardar los valores:

    [XmlRoot("padre")]
    public class padre
    {
        [XmlElement("hijo")]
        public List lstHijos{ get; set; }
    }

    public class hijo
    {
        [XmlElement("id")]
        public int id { get; set; }
        [XmlElement("valor")]
        public string valor { get; set; }

        [XmlElement("entero")]
        public int entero { get; set; }

    }

Y ahora el proceso para la magia:


string xml= "<padre> <hijo> <id>18</id> <valor>CFE7785</valor> <entero>1</entero> </hijo> <padre>"

XmlSerializer serializer = new XmlSerializer(typeof(padre));
using (TextReader reader = new StringReader(xml))
{
        //de esta manera se deserializa
        padre result = (padre)serializer.Deserialize(reader);
}

¿Cómo obtener el #UUID (Timbre fiscal) de un xml timbrado en c#? #facturacion

Para obtener el UUID de un xml que ya tengamos timbrado del SAT lo podemos hacer con LINQ muy sencillo como muestro a continuación:

            //sustituir por la ruta de tu xml
            string rutaXML="C:/carpeta1/carpeta2/factura.xml";

            //variables del esquema
            XNamespace cfdi = @"http://www.sat.gob.mx/cfd/3";
            XNamespace tfd = @"http://www.sat.gob.mx/TimbreFiscalDigital";

            //cargamos el xml
            var xdoc = XDocument.Load(rutaXML);

            //Navegamos hasta el elemento que contiene el UUID
            var elt = xdoc.Element(cfdi + "Comprobante")
                          .Element(cfdi + "Complemento")
                          .Element(tfd + "TimbreFiscalDigital");

            //listo obtenemos el UUID
            var uuid = (string)elt.Attribute("UUID");

Catálogos para facturar CFDI 3.3 SAT en mysql

ULTIMA ACTUALIZACIÓN DE LOS CATÁLOGOS: 3 DE ENERO 2018

Pongo a disposición los catálogos en mysql publicados por SAT necesarios para la facturación 3.3.

Estaré actualizándolos conforme el SAT libere nuevos registros. Solo dar clic en el siguiente enlace:



DESCARGAR CATÁLOGOS SAT

Si deseas descargar los catálogos para sql server entra aquí

Si deseas descargar los catálogos para SQLite entra aquí

¿Cómo llenar un SelectList manualmente? C# .Net

Para llenar un SelectList manualmente y poder ser utilizado en nuestro DropDownList (o lo que sea) lo podemos hacer de la siguiente manera:


//creamos una lista tipo SelectListItem
List<SelectListItem> lst = new List<SelectListItem>();

//De la siguiente manera llenamos manualmente,
//Siendo el campo Text lo que ve el usuario y
//el campo Value lo que en realidad vale nuestro valor
lst.Add(new SelectListItem() { Text = "Pato", Value = "1" });
lst.Add(new SelectListItem() { Text = "Perro", Value = "2" });
lst.Add(new SelectListItem() { Text = "Pollo", Value = "3" });
lst.Add(new SelectListItem() { Text = "Gato", Value = "4" });

//Agregamos la lista a nuestro SelectList
SelectList miSL = new SelectList(lst, "Value", "Text");

¿Cómo reiniciar a 0 la clave primaria en sql server cuando es autoincrementable?

Para reiniciar una clave primaria la cual es autoincrementable, o si deseamos poner que nuestro valor continué en un numero en especifico, se realiza de la siguiente manera:


DBCC CHECKIDENT ('esquema.nombretabla', RESEED, 0);

El anterior código pondrá nuestro contador en 0, siendo el siguiente registro a insertarse 1.

¿Cómo crear una clase para logs (bitácora) en C#?

Comparto una clase la cual sirve para crear logs de manera fácil y dinámica.
La clase crea un archivo el cual va siendo llenado por cadenas, cada mensaje es guardado en un archivo por día y al mensaje guardado se le anexa la hora en la cual fue creado.

 public class Log
    {
        private string Path = "";
      

        public Log(string Path)
        {
            this.Path = Path;
        }

        public void Add(string sLog)
        {
            CreateDirectory();
            string nombre = GetNameFile();
            string cadena = "";

            cadena += DateTime.Now + " - " + sLog + Environment.NewLine;

            StreamWriter sw = new StreamWriter(Path+"/"+nombre,true);
            sw.Write(cadena);
            sw.Close();

        }

        #region HELPER
        private string GetNameFile()
        {
            string nombre = "";

            nombre = "log_" + DateTime.Now.Year + "_" + DateTime.Now.Month + "_" + DateTime.Now.Day + ".txt";

            return nombre;
        }

        private void CreateDirectory()
        {
            try
            {
                if (!Directory.Exists(Path))
                    Directory.CreateDirectory(Path);

               
            }
            catch (DirectoryNotFoundException ex) {
                throw new Exception(ex.Message);
                
            }
        }
        #endregion
    }

Se utiliza de la siguiente manera:

  string path = HttpContext.Current.Request.MapPath("~");
  Log oLog = new Log(path);
  oLog.Add("Hola mundo");

Como obtener el nombre del navegador por medio de #javascript #js

Para obtener cual es el navegador por el cual entra el usuario a nuestro sitio web, anexo la siguiente función la cual regresa un entero dependiendo el navegador:


//1= Opera
//2= Firefox
//3= Safari
//4= IE
//5= Edge
//6= Chrome
//7= Blink
function cualNavegador(){
	// Opera 8.0+
	var isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;

	// Firefox 1.0+
	var isFirefox = typeof InstallTrigger !== 'undefined';

	// Safari 3.0+ "[object HTMLElementConstructor]"
	var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0 || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || safari.pushNotification);

	// Internet Explorer 6-11
	var isIE = /*@cc_on!@*/false || !!document.documentMode;

	// Edge 20+
	var isEdge = !isIE && !!window.StyleMedia;

	// Chrome 1+
	var isChrome = !!window.chrome && !!window.chrome.webstore;

	// Blink
	var isBlink = (isChrome || isOpera) && !!window.CSS;

	if(isOpera)return 1;
	if(isFirefox)return 2;
	if(isSafari)return 3;
	if(isIE)return 4;
	if(isEdge)return 5;
	if(isChrome)return 6;
	if(isBlink)return 7;

	return 0; //sin identificar
}

¿Cómo parsear el formato dd-mm-yy en un DateTime en C# .Net?

Para poder parsear el formato dd-mm-yy en c# .Net, el problema radica que en el año solo tenemos 2 dígitos, pero esto no impide que se pueda realizar de manera fácil, para hacerlo basta con utilizar el método ParseExact de DateTime de la siguiente forma:


DateTime fecha = DateTime.ParseExact("30-01-16", "dd-MM-yy", CultureInfo.InvariantCulture);