3ENGINE

Programación y otros cachivaches

Etiqueta: WCF

Tecnologia

LINQ con WCF: de carga diferida a explícita


LINQ por defecto utiliza la consulta diferida. Cuando «navegamos» entre las clases de un LINQ to SQL (.dbml) éste en background va generando las consultas y de este modo nos ahorramos consultas inutiles.

El problema viene cuando queramos devolver una clase que forma parte de un .dbml como resultado de un método marcado como [OperationContract].

Es necesario modificar el comportamiento por defecto de consulta diferida a una consulta forzada. Ejemplo:

PluginInstanceDataContext pluginsContext =  new PluginInstanceDataContext();

var orderloadOption = new System.Data.Linq.DataLoadOptions();
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith(p => p.PluginParametro);
dlo.LoadWith(p => p.PluginTipoControl);
pluginsContext.LoadOptions = dlo;

var consulta = from plugins in pluginsContext.Plugin
                    where plugins.IdCentro == idCentro
                    select plugins;

Sino lo hacemos así nos encontraremos que las «clases hijas» no contienen datos.




Tecnologia

Cómo habilitar .dbml de LINQ para WCF


Vale, de acuerdo es una «»tonteria»» pero una tonteria que me ha hecho perder unas cuantas horas. Si utilizas LINQ y requieres que un método WCF marcado con atributo [OperationContract] devuelva una clase de un fichero .dbml necesitas que se serialize correctamente para viajar al cliente correctamente, para ello necesitas poner Serialization mode = unidirectional