2016-07-02 9 views
3

レコードに差がある平均のカテゴリのみをリストしたいとします。group byとlinqで複数の結合を持つフィールドにアクセスすることはできません

この違いは、2つのテーブルに存在します。TestOperation、TestOperationDifference

私は3以下のフィールドの平均値を計算したい:このような

TestOperation:DiffPerc 

If DiffPerc < 100 
    "Difference is there and take value of DiffPerc to calculate average" 
else 
    "Dont take that record" 


TestOperationDifference:DiffPerc,DiffRec 
If DiffPerc < 100 
    "Difference is there and take value of DiffPerc and DiffRec to calculate average" 
else 
    "Dont take that record" 




finalAverage=(
        Average(TestOperation.DiffPerc) 
        + Average(TestOperationDifference.DiffPerc) 
        + Average(TestOperationDifference.DiffRec) 
      )/3 

出力:

[0]=Mobile 
    Electronics 
    FinalAverage=30.00 
[1]=Shoes 
    Sports 
    FinalAverage=70.00 
. 
. 
. 

マイコード:

public class Category 
     { 
      public int Id { get; set; } 
      public string Name { get; set; } 
      public Nullable<int> ParentId { get; set; } 
      public virtual ICollection<Variants> Variants { get; set; } 
     } 

    public class Variants 
     { 
      public int Id { get; set; } 
      public string Name { get; set; } 
      public string Type { get; set; } 
      public int CategoryId { get; set; } 
      public virtual ICollection<SubVariants> SubVariants { get; set; } 
      public virtual Category Category { get; set; } 
     } 

     public class SubVariants 
     { 
      public int Id { get; set; } 
      public int VariantId { get; set; } 
      public string Name { get; set; } 
      public virtual Variants Variants { get; set; } 
      public virtual ICollection<TestOperationDifference> TestOperationDifference { get; set; } 
      public virtual ICollection<TestOperationDifference> TestOperationDifference1 { get; set; } 
      public virtual ICollection<TestOperation> TestOperation { get; set; } 
      public virtual ICollection<TestOperation> TestOperation1 { get; set; } 
     } 

     public class Test 
     { 
      public int Id { get; set; } 
      public string Version { get; set; } 
      public virtual ICollection<TestOperation> TestOperation { get; set; } 
      public virtual ICollection<TestOperationDifference> TestOperationDifference { get; set; } 
     } 

     public class TestOperation 
     { 
      public int Id { get; set; } 
      public Nullable<int> TestId { get; set; } 
      public int SourceSubVariantId { get; set; } 
      public int TargetSubVariantId { get; set; } 
      public decimal DiffPerc { get; set; } 
      public virtual SubVariants SubVariants { get; set; } 
      public virtual SubVariants SubVariants1 { get; set; } 
      public virtual Test Test { get; set; } 
     } 

     public class TestOperationDifference 
     { 
      public int Id { get; set; } 
      public Nullable<int> TestId { get; set; } 
      public int SourceSubVariantId { get; set; } 
      public int TargetSubVariantId { get; set; } 
      public decimal DiffPerc { get; set; } 
      public decimal DiffRec { get; set; } 
      public virtual SubVariants SubVariants { get; set; } 
      public virtual SubVariants SubVariants1 { get; set; } 
      public virtual Test Test { get; set; } 
     } 

マイクエリ:

var query = from cat in context.Category 
      join v in context.Variants on cat.Id equals v.CategoryId 
      join sv in context.SubVariants on v.Id equals sv.VariantId 
      join to in context.TestOperation on sv.Id equals to.SourceSubVariantId 
join tod in context.TestOperationDifference on sv.Id equals tod.SourceSubVariantId 
      where 
       (to.DiffPerc < 100) 
       || 
       (tod.DiffPerc < 100) 
       group cat by new {catid = cat.Id} into grp 
       select new 
       { 
       subcategoryname=grp. //not getting property here     
       ParentCategoryName=grp. 
       FinalAverage=  
       } 

しかし、ここでは上記のクエリでは、私はサブカテゴリ名にアクセスしようとしていますし、私は それにアクセスすることはできませんよ。

デモフィドル:Code Fiddle

誰もがこれで私を助けることはできますか?

+1

新しい匿名クラスを作成するときにかっこを入れているのはなぜですか? – dotctor

+0

@dotctor:Okは私の質問を更新しました –

+0

あなたはあなたのクエリを 'grp'にグループ化しました。 'grid.Key'には' catid'プロパティがあります。どちらの物件をお探しですか? – dotctor

答えて

2

grpは、コレクションであるIGroupingのインスタンスなので、よく起こります。あなたは既に推測しているように、NameのプロパティをCategoryにするにはコレクションの要素にアクセスする必要があります。のコレクションをNameIdでグループ化することができます。それはgrp.Key.Name

3

使用して、基本的なクエリは、クエリにtestOperationsとtestOperationDifferencesを適用する必要があり、この

var query = (from cat in category 
         join v in variants on cat.Id equals v.CategoryId 
         join sv in subVariants on v.Id equals sv.VariantId 
         into grp 
         select new { id = cat.Id, subvariant = v.SubVariants, name = cat.Name, type = v.Type}) 
         .GroupBy(x => new {id = x.id, subvariant = x.subvariant}); 

ザ・ようになるはずです。

+0

バリアントテーブルにはサブカテゴリIDが含まれ、親カテゴリIDは含まれません –

+1

各結合では何らかの出力が生成される必要があります。カテゴリとバリアントを結合しても有効な結果は得られません。 – jdweng

+0

申し訳ありませんが、私は実際に出力データを取得していない理由のカテゴリデータを追加するのを忘れていました。 –

関連する問題