1

次のクエリに相当するlinqコードを書き込もうとしています。

SELECT A.*  
FROM  
(  
    SELECT * FROM TableA   
    WHERE id = 100  
) a  
JOIN   
(  
    SELECT Name, MAX(AnotherId) AnotherId   
    FROM TableA   
    WHERE id = 100  
    GROUP BY Name   
) b  
on a.Name  = b.Name and a.AnotherId = b.AnotherId   

これはlinqです

var Collection = from R in DbContext.TableA  
join G in (DbContext.TableA.Where(r => r.Id == 100).GroupBy(r => new { r.Name, r.AnotherId } ).Select(g => new { Name = g.Name , AnotherId = g.Max(o => o.AnotherId) }))  
on new { R.Name, R.AnotherId } equals new { G.Name, G.AnotherId }  
where R.Id == 100  
select R;  

しかし、修正方法がわからない次のコンパイルエラーが発生します。何かご意見は

join句の式の1つの型が正しくありません。'Join'の呼び出しで型推論が失敗しました。

エラー7「System.Linq.IGrouping」に「Name」の定義が含まれておらず、「System.Linq.IGrouping」タイプの最初の引数を受け入れる拡張メソッド「Name」が見つかりませんでした(usingディレクティブまたはアセンブリリファレンス?)

4

4 に答える 4

2

r.Nameでグループ化するだけの場合は、r.Name、r.AnotherIdでグループ化します。

var Collection = from R in DbContext.TableA  
join G in (DbContext.TableA
                      .Where(r => r.Id == 100)
                      .GroupBy(r => r.Name)
                      .Select(g => new { Name = g.Key , AnotherId = g.Max(o => o.AnotherId) }))  
on new { R.Name, R.AnotherId } equals new { G.Name, G.AnotherId }  
where R.Id == 100  
select R; 

そして、すべてを流暢な構文にする

var collection = DbContext.TableA
                          .Where(t1 => t1.Id == 100)
                          .Join(DbContext.TableA
                                .Where(t2 => t2.Id == 100)
                                .GroupBy(t2 => t2.Name)
                                .Select(group => new{Name = group.Key, 
                                                      AnotherId = group.Max(e => e.AnotherId)})
                                 ),
                                 t1 => new{t1.Name, t1.AnotherId} ,
                                 t2 => new{t2.Name, t2.AnotherId},
                                 (t1, t2) => t1);
于 2012-06-25T15:22:41.447 に答える
1

llHi次の構文が必要です。「キー」が追加されていることに注意してください。

var Collection = from R in DbContext.TableA  
join G in (DbContext.TableA.Where(r => r.Id == 100)
            .GroupBy(r => new { r.Name, r.AnotherId } )
            .Select(g => new { Name = g.Key.Name , AnotherId = g.Max(o => o.AnotherId) }))  
on new { R.Name, R.AnotherId } equals new { G.Name, G.AnotherId }  
where R.Id == 100  
select R;  
于 2012-06-25T15:20:30.480 に答える
1

クエリのすべての部分にクエリ構文を使用することをお勧めします。このようにすることで、linqクエリは元のSQLクエリとより類似した構造になります。次のようになります。

var query =
  from a in 
    (from x in DbContext.TableA
     where x.ID == 100 
     select x)
  join b in
    (from x in DbContext.TableA
     where x.ID == 100
     group x by x.Name into x
     select new
     {
       Name = x.Key,
       AnotherId = x.Max(o => o.AnotherId),
     })
  on new { a.Name, a.AnotherId } equals new { b.Name, b.AnotherId }
  select a;
于 2012-06-25T15:24:42.423 に答える
0

sajとRaphaelはどちらも良い点を見つけました。

.GroupBy(r => new { r.Name, r.AnotherId } )
.Select(g => new { Name = g.Name , AnotherId = g.Max(o => o.AnotherId) }))

グループには名前がありません。各グループにはキーがあります(キーにはNameとAnotherIdがあります)。

Max(AnotherId)が必要なため、グループ化キーにAnotherIdを含めないでください(元のクエリのGroupBy句に存在しないのと同じです)。

.GroupBy(r => r.Name)  //the Name is the Key
.Select(g => new { Name = g.Key, AnotherId = g.Max(o => o.AnotherId) }))
于 2012-06-25T15:26:10.900 に答える