2017-02-10 70 views
3

私のコードの表示がLINQのSQL GroupJoinエラー

重大度コード説明プロジェクトファイルの行の抑制状態 エラーCS0411のようなエラー用法から推測することはできませんQueryable.GroupJoin<TOuter, TInner, TKey, TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter, TKey>>, Expression<Func<TInner, TKey>>, Expression<Func<TOuter, IEnumerable<TInner>, TResult>>)メソッドの型引数です。 GroupJoin位置に基づいて、明示的に

data.RawMaterail.Where(c => c.Category.categoryType == 1) 
       .Join(data.Sizes, x => x.DiamondSize.diamondSizeId, 
            y => y.DiamondSize.diamondSizeId, 
            (x, y) => new { RM = x, Size = y }) 
       .GroupJoin(data.PriceLevels.Where(c => c.priceLevelId == PriceLevelId), 
          x => new { x.RM.rMId , x.Size.sizeId}, 
          y => new { y.rmId , y.sizeId}, 
          (y, x) => new { Category = y, PurityLevel = x }) 
       .SelectMany(xy => xy.PurityLevel.DefaultIfEmpty(), 
          (x, y) => new { Category = x.Category, PurityLevel = y }) 
       .Select(item => new 
       { 
        Code = item.Category.RM.rMCode + " " + item.Category.Size.sizeName, 
        Name = item.Category.RM.rMName + " " + item.Category.Size.sizeName, 
        Date = item.PurityLevel.rowDate, 
        Id = (int)item.Category.RM.rMId, 
        RateId = (int?)item.PurityLevel.stonePriceLevelId ?? 0, 
        Price = (double?)item.PurityLevel.price ?? 0, 
        PriceLevelId = (int?)item.PurityLevel.priceLevelId ?? 0, 
        TypeId = (int)item.Category.Size.sizeId, 
        IsRateChanged = false 
       }).OrderBy(c => c.Date).ThenBy(n => n.TypeId).ToList(); 

エラー表示型の引数を指定して試してみて、どのように左のこのタイプは

+0

IMHO _join_&_group join_ in LINQは、クエリ構文では常に簡単に記述して理解することができます。 –

答えて

1
data.RawMaterail.Where(c => c.Category.categoryType == 1) 
       .Join(data.Sizes, x => x.DiamondSize.diamondSizeId, 
            y => y.DiamondSize.diamondSizeId, 
            (x, y) => new { RM = x, Size = y }) 
       .GroupJoin(data.PriceLevels.Where(c => c.priceLevelId == PriceLevelId), 
          x => new { RID = (int?)x.RM.rMId , SID = (int?)x.Size.sizeId}, 
          y => new { RID = (int?)y.rmId , SID = (int?)y.sizeId}, 
          (y, x) => new { Category = y, PurityLevel = x }) 
       .SelectMany(xy => xy.PurityLevel.DefaultIfEmpty(), 
          (x, y) => new { Category = x.Category, PurityLevel = y }) 
       .Select(item => new 
       { 
        Code = item.Category.RM.rMCode + " " + item.Category.Size.sizeName, 
        Name = item.Category.RM.rMName + " " + item.Category.Size.sizeName, 
        Date = item.PurityLevel.rowDate, 
        Id = (int)item.Category.RM.rMId, 
        RateId = (int?)item.PurityLevel.stonePriceLevelId ?? 0, 
        Price = (double?)item.PurityLevel.price ?? 0, 
        PriceLevelId = (int?)item.PurityLevel.priceLevelId ?? 0, 
        TypeId = (int)item.Category.Size.sizeId, 
        IsRateChanged = false 
       }).OrderBy(c => c.Date).ThenBy(n => n.TypeId).ToList(); 
1

x => new { x.RM.rMId , x.Size.sizeId}, 
y => new { y.rmId , y.sizeId}, 

にキーセレクタを変更してみてください参加に参加することができます

x => new { RMId = x.RM.rMId , SizeId = x.Size.sizeId}, 
y => new { RMId = y.rmId, SizeId = y.sizeId}, 

eプロパティはrMId、もう1つはrmIdmの場合が異なります)と命名されました。したがって、コンパイラは、の2種類の匿名型を生成します。しかし、TKeyは、外側と内側のキーセレクタに同じタイプである必要があります。

匿名型のプロパティ名を明示的に宣言すると、このエラーが回避され、コンパイラは両方のキーセレクタに同じ匿名型を使用します。