2015-01-24 4 views
0
NHibernate에

의 특정 열 두 개의 테이블을 조인내가 두 개의 테이블이

------------Customer Table---------------- 
| id | CName | Age | Address | Salary | 
------------------------------------------ 
| 1 | Ben | 18 | a | 1000 | 
| 2 | Mark | 20 | b | 2000 | 
| 3 | Ben | 18 | a | 3000 | 
| 4 | Ben | 19 | c | 4000 | 
| 5 | Mark | 20 | b | 5000 | 
| 6 | Jane | 21 | d | 6000 | 

------------Customer Table---------------- 
| id | PName | CustomerID_id | Amount | 
------------------------------------------ 
| 1 | A  |  1  | 5  | 
| 2 | B  |  2  | 10  | 
| 3 | C  |  1  | 15  | 
| 4 | D  |  2  | 20  | 
| 5 | E  |  2  | 25  | 
| 6 | F  |  6  | 30  | 
| 7 | G  |  6  | 40  | 

내가 SQL 서버 관리에서이 쿼리를 실행하면 :

SELECT CName , Amount 
FROM [TestNhibernate].[dbo].[Product] 
Inner Join [TestNhibernate].[dbo].[Customers] 
    on [TestNhibernate].[dbo].[Product].[Customerid_id] 
      = [TestNhibernate].[dbo].[Customers].[id] 

SQL의 결과는 다음과 같습니다

,536,913
------------------- 
| CName | Amount | 
------------------- 
| Ben | 5  | 
| Mark | 10  | 
| Ben | 15  | 
| Mark | 20  | 
| Mark | 25  | 
| Jane | 30  | 
| Jane | 40  | 

내가

SELECT CName , Sum(salary) as SumSalary, sum(amount) as SumAmount 
FROM [TestNhibernate].[dbo].[Product] 
    Inner Join [TestNhibernate].[dbo].[Customers] 
    on [TestNhibernate].[dbo].[Product].[Customerid_id] 
      = [TestNhibernate].[dbo].[Customers].[id] 
Group By Cname 

결과를이 쿼리를 실행할 때입니다 :

---------------------------------- 
| CName | SumSalary | SumAmount | 
---------------------------------- 
| Ben | 2000  | 20  | 
| Jane | 12000  | 70  | 
| Mark | 6000  | 55  | 
---------------------------------- 

어떻게 표현할 수 NHiberante 쿼리?

UPDATE : 일부 시도

내가

session 
    .QueryOver<Product>() 
    .JoinQueryOver<Customers>(p => p.CustomerID) 
    .SelectList(w => w 
     .Select(x => x.Amount) 
     .Select(z => z.CustomerID)) 
    .List<object[]>() 

이 완료이 코드를 시도하지만 난이 코드

을 쓸 때
session 
    .QueryOver<Product>() 
    .JoinQueryOver<Customers>(p => p.CustomerID) 
    .SelectList(w => w 
     .Select(x=>x.Amount) 
     .Select(z=>z.CustomerID.CName)) 
    .List<object[]>() 

이 작동하지 않습니다!

+1

sth를 사용해 보셨습니까? – RMachnik

+1

그런 종류의 질서 : * "...이 쿼리를위한 NHibernate 코드를 작성하십시오 ..."* 단순히 Stackoveflow의 Q & A 스타일에 대한 모음이 아닙니다. 사실 여기에 명확한 답변입니다 - [NHibernate documentation] (http://nhforge.org/doc/nh/en/index.html) –

+0

에서 Radim Kohler 작성 중입니다! 나는 대략 3 일을 시험해 본다! 그러나 나는 그것을 기울인다! 나는 정말로 도움이 필요하다! 주문하지 마세요!이 요청은 – HADi

답변

0

질문의 정보를 바탕으로 이해하는 데 도움이되는 QueryOver 구문의 초안이 있습니다.

개인적으로
public class Product 
{ 
    ... 
    // instead of this 
    //public virtual Customers CustomerID { get; set; } 
    // we should use 
    public virtual Customers Customers { get; set; } 
} 

차라리 Customer보다 고객을 볼 것입니다 : 우리가 조금 더 많은 표준 명명을 비즈니스 모델이 있어야합니다, 지금

public class ProductDTO 
{ 
    public virtual string ClientName { get; set; } 
    public virtual decimal SumSalary { get; set; } 
    public virtual decimal SumAmount { get; set; } 
} 

: 첫째로 우리는 결과를 나타내는 일부 DTO를 만들어야합니다 ... 여전히 그래도 좋음 CustomersID

여기 매핑은 <many-to-one이어야하므로 값 참조 유형/정수를 나타내는 <property이 아닌 참조 관계를 지정합니다.

이제 쿼리 : NHibernate에 함께 조회 할 수있는 방법을 몇 가지 아이디어를 줄 것이다

// to have access to client name 
Customers client = null; 
// that would be result - used for proper columns aliasing 
ProductDTO dto = null; 

var result = session.QueryOver<Occupation>() 
    .JoinQueryOver<Customers>(p => p.Customers ,() => client) 
    .SelectList(w => w 
     // SUM 
     .SelectSum(x => x.Amount) 
      .WithAlias(() => dto.SumAmount) 
     .SelectSum(x => x.Salary) 
      .WithAlias(() => dto.SumSalary) 
     // GROUP BY 
     .Select(x => client.CName) 
      .WithAlias(() => dto.ClientName) 
    ) 
    // we do have enough info to ask NHibernate for 
    // fully typed result - Product DTO 
    .TransformUsing(Transformers.AliasToBean<ProductDTO>()) 
    .List<ProductDTO>(); 

. 또한 고객을 연장하려면 IList<Products>

+0

고마워. 만약 좋은 참고 자료를 알고 있다면 pls 나에게 소개해. – HADi

+1

[16. QueryOver Queries] (http://nhforge.org/doc/nh/en/index.html#queryqueryover)를 참조하십시오. 실제로 필요한 것들이 대부분 있습니다. 그리고 SO는 NHibernate에 관한 거의 모든 질문에 대한 끝없는 경험의 원천입니다 ... 행운을 빌어 요;) –