En este artículo, el autor presenta en detalle la consulta conjunta de Linq, porque me temo que los lectores no entienden bien este aspecto, así que antes de hablar de la consulta conjunta de Linq, primero te daré algunos conocimientos y luego hablaré de cómo se implementa la consulta conjunta de Linq, con la esperanza de ayudarte.
Primero, vamos a entender algunos puntos de conocimiento sobre la consulta conjunta de Linq.
1. Tipo de entrega anónima
vacío estático Main(string[] args) { var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); Console.Write(Usuario.NombreDeUsuario); } objeto estático GetAnonymous() { var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; devolver Usuario;
} Cuando definimos un tipo anónimo, solo puede pasarse a través del tipo objeto, y el compilador no conocerá el tipo real del tipo anónimo tras el paso.
Esta línea puede ser fundida mediante el método de extensión Cast. A continuación se muestra un prototipo del método Molde.
T Cast estático público (este objeto o, T t) { retorno ();
} 2. ¿Cómo generar una lista de tipos anónima para una consulta federada de Linq?
var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); var list = nueva lista< ?>(); El principio es el mismo que el anterior.
var User = nuevo { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); lista. Añadir (usuario); Console.Write(list[0]. Nombre de usuario); Echemos un vistazo al método MakeList():
public static List MakeList(this T t) { volver a nueva Lista();
} Por supuesto, puede que pienses que el método anterior no es lo suficientemente perfecto y necesitas añadir un Usuario a la lista, así que tienes el siguiente método:
Lista pública estática MakeList (este T t, params T[] elementos) { devolver nueva Lista(elementos); } Cuando se llama, puede escribirse como:
var User = nuevo { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(User); Console.Write(list[0]. Nombre de usuario); Esta vez, vayamos al grano y entendamos cómo se implementa la consulta federada de Linq.
var q = de p en db. Productos donde p.Supplier.Country == "USA" & & p.UnitsInStock == 0 selecciona p; La consulta anterior son dos tablas relacionadas, y solo se devuelve el contenido de una tabla; en este caso, se puede devolver una Lista fuertemente tipada en la capa de datos. Por ejemplo:
Lista pública SelectProducts() { var q = de p en db. Productos donde p.Supplier.Country == "USA" & & p.UnitsInStock == 0 selecciona p; volver q.ToList;
} Si el conjunto de resultados devuelto es mayor de dos tablas, ¿cómo debería pasarse? Debes haber pensado que si el conjunto de resultados que se devuelve es una sola línea de datos, podemos usar el tipo de entrega anónima que mencionamos antes para obtener los resultados que necesitamos. Objeto público
objeto público SelectProducts() { var q = de p en db. Productos donde p.Supplier.Country == "USA" & & p.UnitsInStock == 0 select new {p.UnitsInStock,p.Supplier.Sid}; resultado var = q.Single(); resultado de retorno;
} Sin embargo, esta premisa es que la capa de lógica de negocio necesita conocer los tipos específicos de tipos de anonimato en la capa de datos. Esta superposición tiene poca importancia. Esto no es lo que queremos. Además, el método de usar el tipo anónimo List para devolver el conjunto de resultados de datos de varias filas también falló tras los experimentos. Esto significa que ninguno de los dos métodos para pasar el anonimato al principio de este artículo funcionará.
Método 1: La consulta federada de Linq personaliza las clases con la misma estructura que el tipo de retorno
clase pública CustomQuery { uint público UnitsInStock { get; set; } public int Sid { get; set; }
} Esto puede resolverse cuando los resultados de la consulta son un conjunto de resultados de varias tablas. Como necesitas saber el tipo de anonimato devuelto, necesitas definir una clase adicional además de no ajustarse a la multicapa. Pero esto es cierto y puede devolver los resultados que necesitamos usando tipos fuertes.
Método 2: Consulta federada de Linq usando delegación System.Func (Referencia: Devolver var de un método en C# 3.0)
Capa de datos:
Publico IEnumerable GetCustomersWithOrders(Func, TProyección> proyección) { devolución del cliente en _customers sea customerOrders = de un pedido en _orders donde el orden. CustomerID = customer.ID proyección selecta (cliente, clientesPedidos);
} Capa de lógica de negocio:
resultados var = GetCustomersWithOrders( (cliente, pedidos) => nuevo { Nombre = cliente. Nombre, OrderCount = pedidos. Count() }); El resultado devuelto de esta manera sigue siendo un tipo verdaderamente anónimo en la capa de lógica de negocio y puede usarse directamente.
Método 3: Las consultas federadas de Linq utilizan procedimientos almacenados o vistas. |