Neste artigo, o autor apresenta a consulta conjunta do Linq em detalhes, porque receio que os leitores simplesmente não compreendam muito bem esse aspecto, então, antes de falar sobre a consulta conjunta do Linq, vou primeiro apresentar alguns conhecimentos para você e depois falar sobre como a consulta conjunta do Linq é implementada, na esperança de ajudar você.
Primeiro, vamos entender alguns pontos de conhecimento sobre a consulta conjunta do Linq.
1. Tipo de entrega anônima
Static void Main(string[] args) { var User = GetAnonymous(). Cast(novo { UserName = "", LastLoginIp = "" }); Console.Write(User.UserName); } objeto estático GetAnonymous() { var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; retornar Usuário;
} Quando definimos um tipo anônimo, ele só pode ser passado pelo tipo de objeto, e o compilador não saberá o tipo real do tipo anônimo após a passagem.
Essa linha pode ser lançada pelo método de extensão Cast. Abaixo está um protótipo do método Cast.
T Cast estático público (este objeto o, T t) { retorno ();
} 2. Como gerar uma lista de tipos anônima para consulta federada do Linq?
var User = GetAnonymous(). Cast(novo { UserName = "", LastLoginIp = "" }); var list = nova Lista< ?>(); O princípio é o mesmo do acima.
var User = novo { Nome de Usuário = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); lista. Adicionar (Usuário); Console.Write(list[0]. Nome de Usuário); Vamos dar uma olhada no método MakeList():
public static List MakeList(this T t) { retornar nova Lista();
} Claro, você pode achar que o método acima não é perfeito o suficiente, e precisa adicionar um Usuário à Lista, então você tem o seguinte método:
Lista pública estática MakeList(este T t, params T[] itens) { retornar nova Lista (itens); } Quando chamado, pode ser escrito como:
var User = novo { Nome de Usuário = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(User); Console.Write(list[0]. Nome de Usuário); Desta vez, vamos direto ao ponto e entender como a consulta federada do Linq é implementada.
var q = de p em db. Produtos onde p.Supplier.Country == "USA" & p.UnitsInStock == 0 selecione p; A consulta acima são duas tabelas relacionadas, e apenas o conteúdo de uma tabela é retornado; nesse caso, uma Lista fortemente tipada pode ser retornada na camada de dados. Por exemplo:
Lista pública SelectProducts() { var q = de p em db. Produtos onde p.Supplier.Country == "USA" & p.UnitsInStock == 0 selecione p; retorno q.ToList;
} Se o conjunto de resultados retornado for mais de duas tabelas, como ele deve ser aprovado? Você deve ter pensado que, se o conjunto de resultados devolvido for uma única linha de dados, podemos usar o tipo de entrega anônima que mencionamos antes para obter os resultados que precisamos. Objeto público
objeto público SelectProducts() { var q = de p em db. Produtos onde p.Supplier.Country == "USA" & p.UnitsInStock == 0 selecionar novo {p.UnitsInStock,p.Supplier.Sid}; resultado var = q.Single(); resultado do retorno;
} No entanto, essa premissa é que a camada de lógica de negócios precisa conhecer os tipos específicos de tipos de anonimato na camada de dados. Essa sobreposição tem pouca importância. Isso não é o que queremos. Além disso, o método de usar o tipo anônimo List para retornar o conjunto de resultados de dados multi-linha também falhou após experimentos. Isso significa que nenhum dos dois métodos de passar anonimato no início deste artigo funcionará.
Método 1: Consulta federada Linq personaliza classes com a mesma estrutura do tipo de retorno
classe pública CustomQuery { uint público UnitsInStock { obter; set; } público int Sid { obter; set; }
} Isso pode ser resolvido quando os resultados da consulta são um conjunto de resultados de múltiplas tabelas. Como você precisa saber o tipo de anonimato retornado, precisa definir uma classe adicional além de não estar em conformidade com a multicamada. Mas isso é verdade e pode devolver os resultados que precisamos usando tipos fortes.
Método 2: Consulta federada Linq usando delegação System.Func (Referência: retornando var de um método em C# 3.0)
Camada de Dados:
público IEnumerável GetCustomersWithOrders(func, TProjeição> projeção) { devolução do cliente em _customers deixe customerOrders = do pedido em _orders onde a ordem. CustomerID = customer.ID projeção selecionada (cliente, clientesPedidos);
} Camada de lógica de negócios:
var results = GetCustomersWithOrders( (cliente, pedidos) => novo { Nome = cliente. Nome, OrderCount = ordens. Conde() }); O resultado retornado dessa forma ainda é um tipo verdadeiramente anônimo na camada de lógica de negócios e pode ser usado diretamente.
Método 3: Consultas federadas do Linq usam procedimentos armazenados ou views. |