이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 16456|회답: 0

[ASP.NET] Linq 연합 쿼리 테이블 결과 집합의 반환을 설명하세요

[링크 복사]
게시됨 2015. 5. 8. 오후 4:34:23 | | |

이 글에서 저자는 Linq 조인트 쿼리를 자세히 소개하는데, 독자들이 이 부분을 잘 이해하지 못할 것 같아 먼저 지식을 알려드리고, 그 다음에 Linq 조인트 쿼리가 어떻게 구현되는지 설명해 드리겠습니다.

먼저, Linq 조인트 쿼리의 몇 가지 지식 포인트를 이해해 봅시다.

1. 익명 전달 유형



static void Main(string[] args)   
{ var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });           
   Console.Write(User.UserName);      
}         
정적 객체 GetAnonymous()     
{ var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" };         
      사용자 반환;     
}
익명 타입을 정의할 때, 객체 타입을 통과할 수 있으며, 익명 타입의 실제 타입을 알지 못합니다.

이 선은 캐스트 확장 방법으로 캐스팅할 수 있습니다. 아래는 캐스트 방법의 프로토타입입니다.



공개 정적 T 캐스트(이 객체 o, T t)      
{            
   return ();         
}
2. Linq 연합 쿼리를 위한 익명 타입 목록을 생성하는 방법?        



var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });         
var list = 새 리스트< ?>();
원리는 위와 같습니다.



var User = new   
{     
   UserName = "yaosansi", LastLoginIp = "127.0.0.1"
};              
var list = User.MakeList();         
목록. Add(사용자);            
Console.Write(list[0]. UserName);
MakeList() 메서드를 살펴보겠습니다:



public static List MakeList(this T t) {            
    새 목록();      
}
물론 위 방법이 완벽하지 않다고 생각할 수 있고, 목록에 사용자를 추가해야 하므로 다음과 같은 방법을 사용합니다:      



공개 정적 리스트 MakeList(이 T t, param T[] 항목)         
{            
   새 목록(항목) 반환;   
}  
호출 시 다음과 같이 쓸 수 있습니다:



var User = new   
{   
  UserName = "yaosansi", LastLoginIp = "127.0.0.1"   
};              
var list = User.MakeList(User);         
Console.Write(list[0]. UserName);   
이번에는 본론으로 들어가 Linq 연합 쿼리가 어떻게 구현되는지 이해해 봅시다.



var q = p에서 db. 제품     
여기서 p.Supplier.Country == "USA" & p.UnitsInStock == 0   
선택: p;
위 쿼리는 두 개의 관련 테이블로 구성되며, 한 테이블의 내용만 반환됩니다. 이 경우 데이터 계층에서 강력한 타입 리스트를 반환할 수 있습니다. 예를 들어:



공개 리스트 SelectProducts()   
{ var q = p에서 db. 제품     
       여기서 p.Supplier.Country == "USA" & p.UnitsInStock == 0        
       선택: p;        
       q.ToList를 반환;   
}
반환된 결과 집합이 두 개 이상의 표라면, 어떻게 전달해야 하나요? 결과가 단일 데이터 라인이라면, 앞서 언급한 익명 전달 방식을 사용해 필요한 결과를 얻을 수 있다고 생각하셨겠죠. 공공 오물



공개 객체 SelectProducts()  
{ var q = p에서 db. 제품      
       여기서 p.Supplier.Country == "USA" & p.UnitsInStock == 0        
       새 {p.UnitsInStock, p.Supplier.Sid} 선택      var 결과 = q.Single();  
       반환 결과;   
}
하지만 이 전제는 비즈니스 로직 계층이 데이터 계층 내 특정 익명성 유형을 알아야 한다는 것입니다. 이 층위는 큰 의미가 없습니다. 이건 우리가 원하는 게 아니야. 더불어, 익명 리스트 타입을 사용해 다중 행 데이터 결과 집합을 반환하는 방법도 실험 후 실패했습니다. 즉, 이 글 초반에 언급한 익명성 전달 방식 중 두 가지 모두 작동하지 않습니다.

방법 1: Linq 연합 쿼리는 반환 타입과 동일한 구조를 가진 클래스를 맞춤화합니다



공개 클래스 CustomQuery      
{ 공개 유닛 인스톡   
   { 받아; 세트; }            
  공공 int 시드   
   { 받아; 세트; }        
}
쿼리 결과가 여러 테이블의 결과 집합일 때 이 문제를 해결할 수 있습니다. 반환된 익명성 유형을 알아야 하므로, 다층에 부합하지 않는 클래스 외에 추가 클래스를 정의해야 합니다. 하지만 이것은 사실이며, 강한 타입을 사용하면 필요한 결과를 반환할 수 있습니다.

방법 2: System.Func 위임을 이용한 Linq 연합 쿼리 (참고: C# 3.0의 메서드에서 var를 반환하기)

데이터 계층:



public IEnumerable GetCustomersWithOrders(Func,
투영> 투영)   
{ _customers 고객에게서 돌아왔다           
     customerOrders = 주문에서 _orders                                
     여기서 순서. CustomerID = customer.ID            
     프로젝션(customer, customerOrders) 선택;  
}
비즈니스 로직 계층:



var 결과 = GetCustomersWithOrders(  
(손님, 주문) => 새 제품   
{ 이름 = 고객. 이름,               
     OrderCount = 주문. 백작()        
});
이렇게 반환된 결과는 비즈니스 로직 계층에서 진정한 익명 타입으로 간주되어 직접 사용할 수 있습니다.

방법 3: Linq 연합 쿼리는 저장 프로시저나 뷰를 사용합니다.




이전의:LINQ가 저장 프로시저 반환 값 문제를 발생시켰습니다.
다음:마이크로소프트는 IE를 포기하고 22만 줄의 코드를 만들겠다고 결심했습니다
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com