Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 16456|Resposta: 0

[ASP.NET] Explique o retorno do conjunto de resultados da tabela de consulta federada Linq

[Copiar link]
Publicado em 08/05/2015 16:34:23 | | |

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.




Anterior:LINQ recebe o procedimento armazenado, problema de valor de retorno no meu procedimento armazenado
Próximo:A Microsoft abandonou o IE e estava determinada a fazer 220.000 linhas de código
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com