2010-03-01 11 views
0

다음은 SQL Query Analyzer에서 작동합니다.where 절 in LINQ - C#

select oh.* 
from order_history oh 
join orders o on o.order_id = oh.order_id 
where oh.order_id = 20119 and oh.date_inserted = (
    select max(date_inserted) from order_history where order_id = oh.order_id 
    group by order_id 
) 

LINQ으로 변환하는 방법은 무엇입니까? 테스트 코드에서 컴파일러는 불평 :

var query = from ch in cdo.order_histories 
    join c in cdo.orders on ch.order_id equals c.order_id 
    where (ch.order_id.equals(1234)) && 
    (ch.date_inserted == (cdo.order_histories.Max(p => p.date_inserted))) 
    select new OrderData() { }; 
'&이 &' 'System.DateTime'

내 LINQ 코드 유형 'INT'의 피연산자에 적용 할 수없는

오류 운영자

업데이트 : '=='를 사용하지 않았습니다. 나머지

항목 내 SQL 쿼리에서 이것이다 :

oh.date_inserted = (
select max(date_inserted) from order_history where order_id = oh.order_id 
group by order_id) 

내가 LINQ에서이 작업을 수행하려면 어떻게합니까?

+0

@ltech : 글쎄, 당신은 당신의 LINQ-to-SQL 코드에있는 것을 보여주지 못하기 때문에 조금 어렵습니다. LINQ-to-SQL 또는 LINQ-to-Entities를 사용하는지 여부도 지정하지 않습니다. – casperOne

+1

처음에는 C#에서'='가 대입에 사용되고'=='는 동등성을 테스트하는 데 사용됩니다. – Greg

답변

5

order_id 필드에서 필터링 할 때 어딘가에 등호가 누락 된 것처럼 보입니다. 당신은 아마이 :

oh.order_id = 20119 && ... 

반면에 당신 해야이 있습니다

oh.order_id == 20119 && ... 

주 할당 연산자 대 항등 연산자. 대입 연산자의 결과는 할당 된 값입니다. 따라서 int 및 System.DateTime의 피연산자를 비교할 수 없다는 오류가 발생합니다.

나는 또한 date_inserted의 값과 대조하여 동일한 문제가 있다고 가정합니다.

질문의 두 번째 부분에 대해 관련 하위 쿼리의 변환이 완료되었습니다. SQL에서

당신은 :

oh.date_inserted = (
select max(date_inserted) from order_history where order_id = oh.order_id 
group by order_id) 

그리고 당신은

ch.date_inserted == (cdo.order_histories.Max(p => p.date_inserted)) 

이 LINQ - 투 - SQL에서

당신은 단지를 캡처 폐쇄의 장점을 취하는 order_histories에 대한 필터를 추가해야 그래서 같은 ch 인스턴스 order_id 값 :

ch.date_inserted == (cdo.order_histories. 
    Where(ch2 => ch2.order_id == ch.order_id). 
    Max(p => p.date_inserted)) 
0

동의하지만 일부 머리말에서 "=="(평가) 대신 "="(할당)을 사용하고 있습니다. 맞습니까? C#은 여기서 SQL을 구분하지 않습니다.

1

SQL을 LINQ로 변환하거나 원하는대로 LINQ를 작성할 수 있습니다.

var result = cdo.order_histories 
    .Where(oh => oh.order_id == 20119) 
    .OrderByDescending(oh => oh.date_inserted) 
    .Take(1) 
    .Select(oh => new {history = oh, order = oh.order} 
    .Single();