metodos ejemplos consultas c# entity-framework linq datacontext

ejemplos - Simulación de uniones de contexto cruzado-LINQ/C#



linq c# ejemplos (3)

Este es el "trabajo alrededor" que hemos encontrado ...

Construimos nuestras tablas de la otra base de datos manualmente y si está en el mismo servidor, entonces prefijamos el nombre de la tabla con:

<DatabaseName>.<SchemaName>.<YourTableName>

si están en un servidor vinculado, también tiene que prefijarlo con el nombre del servidor:

<ServerName>.<DatabaseName>.<SchemaName>.<YourTableName>

Esto le permitirá hacer uniones y aún así devolver un IQueryable no ejecutado ... que es lo que queríamos. Las otras 2 formas incluyen la participación de IEnumerables en memoria, lo que significa que extraiga todos los registros de cada uno antes de realizar la combinación (arriba) y de una combinación IQueryable utilizando un método de contenido que tiene limitaciones ...

Esperemos que en el futuro el DataContext se construya lo suficientemente inteligente como para saber que si los servidores están vinculados, puede hacer uniones entre dos diferentes.

Aquí está el problema:

Tengo 2 contextos de datos en los que me gustaría hacer una unión. Ahora sé que LINQ no permite uniones de un contexto a otro, y sé que 2 posibles soluciones serían crear un solo contexto de datos o tener 2 consultas separadas (que es lo que estoy haciendo por ahora). Sin embargo, lo que me gustaría hacer es "simular" una unión.

Esto es lo que he intentado.

using (var _baseDataContext = Instance) { var query = from a in _baseDataContext.Account.ACCOUNTs where a.STR_ACCOUNT_NUMBER.ToString() == accountID join app in _baseDataContext.Account.APPLICATIONs on a.GUID_ACCOUNT_ID equals app.GUID_ACCOUNT join l in GetLoans() on app.GUID_APPLICATION equals l.GUID_APPLICATION select l.GUID_LOAN; return query.Count() > 0 ? query.First() : Guid.Empty; } private static IQueryable<LOAN> GetLoans() { using (var _baseDataContext = Instance) { return (from l in _baseDataContext.Loan.LOANs select l).AsQueryable(); } }

En tiempo de ejecución me sale es

System.InvalidOperationException: la consulta contiene referencias a elementos definidos en un contexto de datos diferente

EDITAR:

Solución de trabajo:

using (var _baseDataContext = Instance) { var query = from a in _baseDataContext.Account.ACCOUNTs where a.STR_ACCOUNT_NUMBER.ToString() == accountID join app in _baseDataContext.Account.APPLICATIONs on a.GUID_ACCOUNT_ID equals app.GUID_ACCOUNT join l in GetLoans() on app.GUID_APPLICATION equals l.GUID_APPLICATION select l.GUID_LOAN; return (query.Count() > 0) ? query.First() : Guid.Empty; } private static IEnumerable<LOAN> GetLoans() { using (var _baseDataContext = Instance) { return (from l in _baseDataContext.Loan.LOANs select l).AsQueryable(); } }


Estoy a favor de crear un contexto de datos separado que contenga solo las dos tablas a las que desea unirse. Pero supongo que podría mantener una tabla temporal (que contiene datos del primer contexto) en el segundo contexto, y luego unirse a la tabla temporal.


Tal vez algo como esto puede hacer que empieces en la dirección correcta. Hice una base de datos simulada con columnas similares basadas en sus nombres de columna y obtuve algunos resultados.

class Program { static AccountContextDataContext aContext = new AccountContextDataContext(@"Data Source=;Initial Catalog=;Integrated Security=True"); static LoanContextDataContext lContext = new LoanContextDataContext(@"Data Source=;Initial Catalog=;Integrated Security=True"); static void Main() { var query = from a in aContext.ACCOUNTs join app in aContext.APPLICATIONs on a.GUID_ACCOUNT_ID equals app.GUID_ACCOUNT where app.GUID_APPLICATION.ToString() == "24551D72-D4C2-428B-84BA-5837A25D8CF6" select GetLoans(app.GUID_APPLICATION); IEnumerable<LOAN> loan = query.First(); foreach (LOAN enumerable in loan) { Console.WriteLine(enumerable.GUID_LOAN); } Console.ReadLine(); } private static IEnumerable<LOAN> GetLoans(Guid applicationGuid) { return (from l in lContext.LOANs where l.GUID_APPLICATION == applicationGuid select l).AsQueryable(); } }

¡Espero que esto ayude!