c# - multiple - query data entity framework
Error: "La expresión LINQ especificada contiene referencias a consultas que están asociadas a contextos diferentes" (2)
Recibo el error que se muestra en el título de una consulta LINQ que incluye dos tablas de dos archivos diferentes de edmx. Aquí está la consulta:
var query = (from a in db1.Table1
join b in db1.Table2 on a.Id equals b.Id
orderby a.Status
where b.Id == 1 && a.Status == "new"
select new
{
Id = a.Id,
CompanyId = (from c in db2.Company
where s.Id == a.Id
select
new { c.CompanyId })
});
db1
y db2
son contextos que están asociados con dos archivos diferentes de edmx. ¿Cómo puedo superar este error?
Deberá realizar dos consultas a la base de datos:
var IDs = (from a in db1.Table1
join b in db1.Table2 on a.Id equals b.Id
orderby a.Status
where b.Id == 1 && a.Status == "new"
select new a.Id).ToArray();
var query = from c in db2.Company
join a in IDs on c.Id equals a.Id
select new { Id = a.Id, CompanyId = c.CompanyId };
The .ToArray()
es crucial. Impide que EF intente ejecutar la consulta combinada (que fallará ya que usa dos contextos diferentes). Puede usar .AsEnumerable()
si prefiere mantener la carga .AsEnumerable()
.
Y su pregunta de seguimiento:
¿Hay alguna otra forma de optimizar la consulta LINQ? Es decir, ¿realizar la acción en una sola consulta LINQ?
Para que su consulta original se ejecute correctamente, debe usar solo un único contexto de datos, lo que significa que todos los datos deben estar disponibles desde un solo EDMX, lo que a su vez significa una única cadena de conexión. Hay varias formas en que puede lograr eso:
- Si ambas tablas están en la misma base de datos, agréguelos a un único EDMX.
- Si están en bases de datos diferentes pero en la misma instancia, cree una vista en una de las bases de datos que selecciona de la tabla en la otra base de datos, luego agregue la tabla local y visualice a un solo EDMX.
- Si están en diferentes instancias / servidores, crearon un servidor vinculado, luego crearon una vista de la tabla en el servidor vinculado, luego agregaron la tabla local y la vista a un solo EDMX.
O necesita agregar la segunda tabla al modelo del primer contexto. Si esto se encuentra en múltiples bases de datos, debe hacer la búsqueda secundaria en el lado del cliente utilizando una unión Linq to Objects.