2011-01-26 2 views
1

는 다음 LINQ 쿼리 고려 :변수를 선택하는 방법 Linq 개체의 다른 필드를?

from r in result 
join oUS in onOrderUS on r.ItemGUID equals oUS.ItemGUID into jOnOrderUS 
from oUS in jOnOrderUS.DefaultIfEmpty() 
let OnOrderUS = oUS != null ? oUS.UnitQty : 0 
select (new Func<ItemMinMaxView>(() => 
{ 
    r.OnOrderUS = OnOrderUS; 

    return r; 
})).Invoke() 

나는 결과에서 R을 선택합니다,하지만 OU에의 데이터로 필드를 채 웁니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

1

를 원하는 것을 할 것입니다. 그런 다음 Reactive Extensions (Rx)을 활용하여 원하는 부작용 (예 : 값 할당)을 유발할 수 있습니다.

먼저 Anthony가 제안한 것처럼 쿼리를 작성 하겠지만 쿼리가 올바른지 확인하고 싶습니다.

두 개 이상의 onOrderUS 레코드가 반환 된 경우 마지막으로 발견 된 레코드 만 ItemMinMaxView 레코드에 할당합니다.

레코드가 0 개 또는 1 개만 있으면 쿼리는 문제가 없지만 더 간단 할 수 있습니다.

어느 쪽이든, 대신이 쿼리를 시도 :

var output = query 
    .Do(x => x.Result.OnOrderUS = x.OnOrderUS) 
    .Select(x => x.Result) 
    .ToArray(); 

.Do(...) 방법의 일부입니다

var query = 
    from r in result 
    join oUS in onOrderUS on r.ItemGUID equals oUS.ItemGUID into goUSs 
    let OnOrderUS = goUSs.Sum(x => x.UnitQty) 
    select new 
    { 
     Result = r, 
     OnOrderUS 
    }; 

가 그럼 난 (할당 부작용과) 최종 결과이 같은 얻을 것 Rx가 있으며 이러한 종류의 부작용이있을 수 있습니다.

Rx에서 IEnumerable<T>에 대한 좋은 확장 메소드로드가 발생하므로 체크 아웃하지 않았다면 그렇게해야합니다. 최근에 supported Microsoft developer tool으로 프로모션되었습니다.

2

필자의 기능이 구성 요소로 분할되는 것을보고 싶습니다. 초기 쿼리 (조인, 투영 등), 변이, 그리고 당신이 필요로하는 구체적인 결과를 반환합니다. 예 :

var query = from r in result 
      join oUS in onOrderUS on r.ItemGUID equals oUS.ItemGUID into jOnOrderUS 
      from oUS in jOnOrderUS.DefaultIfEmpty() 
      let OnOrderUS = oUS != null ? oUS.UnitQty : 0 
      select new { r, OnOrderUS }; 

foreach (var item in query) 
{ 
    item.r.OnOrderUS = item.OnOrderUS; 
} 

return query.Select(item => item.r); 
// assumes this is in a method returning IEnumerable<R> 

foreach를 코딩하지 않으려면 다음과 같이 작성할 수 있습니다. 나는 쿼리의 돌연변이를 좋아하지 않는다, 그러나 이것은 당신은 내가 너무 가독성을 돕기 위해 더 논리적 인 부분으로 쿼리 분할을보고 싶다

Func<R, int, R> mutateR = (r, onOrderUS) => { r.OnOrderUS = onOrderUS; return r; }; 

var query = from r in result 
      join oUS in onOrderUS on r.ItemGUID equals oUS.ItemGUID into jOnOrderUS 
      from oUS in jOnOrderUS.DefaultIfEmpty() 
      let OnOrderUS = oUS != null ? oUS.UnitQty : 0 
      select mutateR(r, OnOrderUS); 
+0

조금 덜 효과적입니까? foreach는 데이터를 완전히 순환합니다. 선택 영역 내의 Func은 데이터가 선택 될 때 즉시 수행합니다. – EtienneT

+0

@EtienneT, 나는 단지 돌연변이를보고 싶지 않다. 하지만 foreach없이 원하는대로 편집 할 수있는 기능을 제공했습니다. –

+0

이것은 Func이 쿼리를 인라인으로 선언하고 호출하는 것과 거의 같습니다. 귀하의 답변 주셔서 감사합니다! – EtienneT

관련 문제