2011-09-29 4 views
2

그룹화 된 쿼리에서 결과 집합을 반환하려고하는데 선택 권한을 얻을 수 없습니다. LinqPad에서 커서는 Grouped.Key.ItemID의 GroupID.Key.ItemID로 점프합니다.그룹화 후 LINQ 선택

'int'에는 'ItemID'에 대한 정의가없고 'int'유형의 첫 번째 인수를 허용하는 확장 메서드 'ItemID'가 없습니다. '

을 볼 수 있습니다 여기에 쿼리 :

from B in Bids 
join I in Items on B.ItemID equals I.ItemID 
group new {B, I} by I.ItemID into Grouped 
select new { 
    ItemID = Grouped.Key.ItemID, 
    ItemName = Grouped.Key.ItemName, 
    Bids = Grouped.Key.B 
} 

나는 항목 ID, 항목 이름 및 관련 입찰의 모든 레코드 구성 레코드가 설정 반환을 부탁합니다.

정말 감사합니다, 기록을 정확하게 말한다

BK

답변

1

Grouped.Key는 grouped by x 절에서 지정한 필드를 나타냅니다. 쿼리 결과로 Key = I.ItemID.

예를 들어, 계층 구조를 평평하게해야하는 SQL 관점에서 생각하는 대신 LINQ의 OO 특성과 개체 그래프를 사용하십시오. 귀하의 예제를 조금 수정하고 C# 문을 사용하도록 LINQPad를 설정하면, 당신이 찾고있는 것을 더 많이 얻을 것이라고 생각합니다. 참고 : Dump() 확장 메서드는 LINQPad에서만 결과를 출력하고 그 결과 계층 구조를 표시합니다.

var bids = new [] { new { ItemID = 1, BidValue = 30 } , new {ItemID=1, BidValue=45}}; 
var items = new [] { new { ItemID = 1, ItemName = "x" }, new {ItemID = 2, ItemName="y"} }; 

var query = from i in items 
      select new 
      { 
      i.ItemID, 
      i.ItemName, 
      Bids = from b in bids 
        where b.ItemID == i.ItemID 
        select b 
      }; 

query.Dump(); 

즉, 귀하의 카테고리는 LINQ to SQL을 나타냅니다. 모델은 SQL 또는 EF에 LINQ에있는 경우, 당신은 매핑 된 연결을 사용하여보다 쉽게이 작업을 수행 할 수 있습니다 :

이 GROUPBY에서
var query = from i in dc.Items 
      select new 
      { 
       i.ItemID, 
       i.ItemName, 
       i.Bids 
      }; 

query.Dump(); 
+0

그것은 Linq to SQL이고 아래쪽 쿼리는 내가 찾고있는 것을 반환합니다. 당신의 답변은 똑같은 질의를 언급했으나 실제로 문제를 일으켰 기 때문에 답으로 표시 할 것입니다. LINQ를 배울 때 SQL의 방식을 포기하고 3 차원에서 생각하기가 힘듭니다. 도와 주신 모든 분들께 감사드립니다! – BKahuna

1

. Groupped.Key에는 I.ItemID가 포함되지만 전체 I는 포함하지 않습니다. 따라서 Groupped.Key.ItemID을 쓸 수 없습니다.

이 고려 :

from B in new [] { new { ItemID = 1, BidValue = 30 } } 
join I in new [] { new { ItemID = 1, ItemName = "x" } } on B.ItemID equals I.ItemID 
group new { B, I } by I into Groupped 
select new { 
    ItemID = Groupped.Key.ItemID, 
    ItemName = Groupped.Key.ItemName, 
    Bids = (from g in Groupped select g.B).ToList() 
} 
+0

나는 입찰가 목록을 그룹화하기 위해 적절한 방법을 찾고 있었고, 대부분의 시간 동안 SO 및 기타 사이트를 보았습니다. 감사합니다. – Wil

1

글쎄, 당신은 입찰에서 데이터베이스에서 외래 키의 설정을 가지고 가정 -> 항목은 그룹에 합류 모든 필요가 없다.

항목에는 이미 입찰가 모음이 있습니다.

그래서 당신은 같은 것들을 할 수 있습니다 : 당신이 정말로 익명의 형태를 갖고 싶어

var x = db.Items.Single(i=>ItemId == 1); // get one item 
foreach (bid b in x.Bids) // iterate through all the bids 
{} 

를이 할 것 : Linq2Sql의 아름다움

from i in db.items 
select new { i.ItemID, i.ItemName, i.Bids } 

합니다. Linq에서 SQL을 작성하는 대신,보다 객체 지향적 인 접근 방법을 사용하십시오.

0

이 항목 ID가 키입니다. ItemID에 B 속성이 없습니다.

group new {B, I} by I.ItemID into Grouped 

여기에 적절하게 그룹을 액세스하는 쿼리의 개선 된 버전입니다.

from b in Bids 
join i in Items on b.ItemID equals i.ItemID 
group b by i into groupedBids 
select new 
{ 
    Item = i, 
    Bids = groupedBids 
}; 

여기에 같은 일을 GroupJoin을 사용하는 버전입니다.
from i in Items 
join b in Bids on i.ItemID equals b.ItemID into groupedBids 
select new 
{ 
    Item = i, 
    Bids = groupedBids 
}; 

다음은 로컬 데이터베이스와 그룹에 가입 않는 버전입니다. LinqToSql은 각 그룹의 요소를 얻기 위해 그룹의 키로 다시 쿼리해야하기 때문에 (groupby와 n + 1 문제로 알려짐) 이와 같은 작업을 수행 할 수 있습니다.

from x in 
(
    from i in Items 
    join b in Bids on i.ItemID equals b.ItemID 
    select new {Item = i, Bid = b} 
).ToList() 
group x.b by x.i into groupedBids 
select new 
{ 
    Item = groupedBids.Key, 
    Bids = groupedBids 
}; 
+0

이 마지막 하나는 비효율적입니다. DataContext에서 LoadOptions로 N + 1 문제를 해결하는 것이 더 좋습니다. – Pleun