이 글에서 저자는 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 연합 쿼리는 저장 프로시저나 뷰를 사용합니다. |