2017-02-10 66 views
3

這裏是我的代碼顯示像LINQ的SQL錯誤羣組加入

錯誤的嚴重性代碼說明項目文件的線路抑制狀態 錯誤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>>)類型參數不能從使用推斷。嘗試基於羣組加入位置明確

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

恕我直言_join_&_group join_在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,另一個rmIdm的情況不同)。所以編譯器生成兩種不同的匿名類型。但TKey需要爲爲相同類型爲外部和內部的密鑰選擇器。

通過明確聲明匿名類型的屬性名,可以避免此錯誤,並且編譯器對兩個鍵選擇器都使用相同的匿名類型。