2016-11-15 13 views
3

更新:C SQLグループに#のLINQ複数の行

場所の特別な兆候と呼ばれる1つの以上のテーブルがあります。格納されたロケーションIDと特殊記号をペアにします。変数SpecialSignsLocationに結果を作成し、以下を得ることが必要である:

public IEnumerable<KeyValuePair<int, int>> SpecialSignsLocation = new List<KeyValuePair<int, int>>(); 

    //json result 
    ... 
     SpecialSigns: { 
        BodyType: [1, 2], 
        Hair: [3, 1, 2], 
        SpecialSignsLocation: [[1,2], [3,5], [4,1]] 
       } 

    ... 

    //query 
    SpecialSignsLocation = entity.persons_signs_location 
          .Where(c => c.PersonId == persons.Id) 
          .Select(s => new { s.Location, s.Sign}) 
          .ToDictionary(l => l.Location, l => l.Sign) 

私は要求を書いたが、私は例外を飛ぶ:エンティティへ

式のLINQは、法制度を認識しません。コレクション.Generic.Dictionary

Persons、PersonsSignsHair、PersonsSignsBodyTypeの3つのテーブルがあります。一人が特別な看板がたくさん持っていることがあります。クエリの後

Picture

public List<object> GetPerson(int id) 
{ 
    var query = (from persons in entity.persons where persons.Id.Equals(id) 
       join signs_body_type in entity.persons_signs_body_type 
       on persons.Id equals signs_body_type.PersonId into _signs_body_type 
         from signs_body_type in _signs_body_type.DefaultIfEmpty() 

       join signs_hair in entity.persons_signs_hair 
       on persons.Id equals signs_hair.PersonId into _signs_hair 
         from signs_hair in _signs_hair.DefaultIfEmpty() 

       select new Person 
         { 
          PersonName = persons.PersonName, 
          PersonLastName = persons.PersonLastName, 
          PersonPatronymic = persons.PersonPatronymic, 
          SpecialSigns = new PersonSpecialSigns() 
          { 
           BodyType = _signs_body_type.Select(c => c.PersonBodyType), 
           Hair = _signs_hair.Select(h => h.PersonHair) 
          } 
       }); 

    return query.ToList<object>(); 
} 

を、結果をJSONに変換されます。出力は、私は次の結果を期待します:

[ 
    { 
     SpecialSigns: { 
      BodyType: [1, 2], 
      Hair: [3, 1, 2] 
     }, 

     PersonName: "Aaa", 
     PersonLastName: "Bbb", 
     PersonPatronymic: "Ccc", 

    }, 
] 

代わりに結果は6回複製されます。

[ 
    { 
     SpecialSigns: { 
      BodyType: [1, 2], 
      Hair: [3, 1, 2] 
     }, 

     PersonName: "Aaa", 
     PersonLastName: "Bbb", 
     PersonPatronymic: "Ccc", 

    }, 
{ 
     SpecialSigns: { 
      BodyType: [1, 2], 
      Hair: [3, 1, 2] 
     }, 

     PersonName: "Aaa", 
     PersonLastName: "Bbb", 
     PersonPatronymic: "Ccc" 

    }, 
{ 
     SpecialSigns: { 
      BodyType: [1, 2], 
      Hair: [3, 1, 2] 
     }, 

     PersonName: "Aaa", 
     PersonLastName: "Bbb", 
     PersonPatronymic: "Ccc" 

    }, 
{ 
     SpecialSigns: { 
      BodyType: [1, 2], 
      Hair: [3, 1, 2] 
     }, 

     PersonName: "Aaa", 
     PersonLastName: "Bbb", 
     PersonPatronymic: "Ccc" 

    }, 
{ 
     SpecialSigns: { 
      BodyType: [1, 2], 
      Hair: [3, 1, 2] 
     }, 

     PersonName: "Aaa", 
     PersonLastName: "Bbb", 
     PersonPatronymic: "Ccc" 

    }, 
{ 
     SpecialSigns: { 
      BodyType: [1, 2], 
      Hair: [3, 1, 2] 
     }, 

     PersonName: "Aaa", 
     PersonLastName: "Bbb", 
     PersonPatronymic: "Ccc" 

    } 
] 

質問:はどのように私は特別な識別子を組み合わせてください、そして配列にそれらをもたらすのだろうか?

+0

のような関連するエンティティを持つ人を読み込むことができ

public DbSet<PersonsSignsHair> PersonsSignsHair { get; set; } public DbSet<PersonsSignsBodyType> PersonsSignsBodyType { get; set; } public DbSet<Person> People { get; set; } 

をあなたも取得結果を記載してください。 – wdosanjos

+1

@ wdosanjos私は彼が十分にはっきりしていたと思います:*結果は6回複製されます* – meJustAndrew

+0

あなたは 'FirstOrDefault()'を行うことができるレコードを1つだけ持っていれば –

答えて

1

以下を試してください。 join'sがデカルト積を引き起こしています。

public List<object> GetPerson(int id) 
{ 
    var query = (from persons in entity.persons where persons.Id.Equals(id) 

       select new Person 
        { 
         PersonName = persons.PersonName, 
         PersonLastName = persons.PersonLastName, 
         PersonPatronymic = persons.PersonPatronymic, 
         SpecialSigns = new PersonSpecialSigns() 
         { 
          BodyType = entity.persons_signs_body_type 
               .Where(c => c.PersonId == persons.Id) 
               .Select(c => c.PersonBodyType), 
          Hair = entity.persons_signs_hair 
              .Where(c => c.PersonId == persons.Id) 
              .Select(h => h.PersonHair) 
         } 
       }); 

    return query.ToList<object>(); 
} 
+0

ありがとうございます! – murash

1

私はこれを撮影します。しかし、私はほぼDefaultIfEmpty()を使用すると、結果にLeft Outer Joinを持っていることを確信しています。だからこそ、あなたはおそらくすべてを複製しているのです。これを省略すると、あなたはあなたの内に、私は人が最初に存在するかどうかを確認するためにFirstOrDefault()を使用することになり、その後、私はクラスを移入う勧告として、また

var query = from persons in entity.persons where persons.Id == id 
      select new Person 
      { 
       PersonName = persons.PersonName, 
       PersonLastName = persons.PersonLastName, 
       PersonPatronymic = persons.PersonPatronymic, 
       SpecialSigns = new PersonSpecialSigns() 
       { 
        BodyType = entity.persons_signs_body_type 
            .Where(i => i.PersonId == id) 
            .Select(i => i.PersonBodyType), 
        Hair = entity.persons_signs_hair 
           .Where(i => i.PersonId == id) 
           .Select(i => i.PersonHair) 
       } 
      }; 

(私はあなたが探している何を考えて)参加しています。

var personData = entity.persons.FirstOrDefault(i = i.Id == id); 

if(personData != null) 
{ 
    var person = new Person 
    { 
     PersonName = personData.PersonName, 
     PersonLastName = personData.PersonLastName, 
     PersonPatronymic = personData.PersonPatronymic, 
     SpecialSigns = new PersonSpecialSigns() 
     { 
      BodyType = entity.persons_signs_body_type 
          .Where(i => i.PersonId == personData.Id) 
          .Select(i => i.PersonBodyType), 
      Hair = entity.persons_signs_hair 
         .Where(i => i.PersonId == personData.Id) 
         .Select(i => i.PersonHair) 
     } 
    }; 
    //continue with the code 
} 
+0

ありがとう、それは動作します! – murash

+0

甘い!私はそれがうまく働いた –

1

ここでは簡潔なlinqがうまく動作するはずです。あなたはEntity Frameworkのとあなたのエンティティを使用していると仮定すると、

public List<object> GetPerson(int id) 
{ 
    var query = entity.persons.First(x=> x.Id == id).Select(x=> new Person 
       { 
        PersonName = x.PersonName, 
        PersonLastName = x.PersonLastName, 
        PersonPatronymic = x.PersonPatronymic, 
        SpecialSigns = new PersonSpecialSigns       
        { 
         BodyType = entity.persons_signs_body_type 
             .Where(y => y.PersonId == x.Id) 
             .Select(y => y.PersonBodyType), 
         Hair = entity.persons_signs_hair 
             .Where(y => y.PersonId == x.Id) 
             .Select(y => y.PersonHair) 
        } 
       }); 

    return query.ToList<object>(); 
} 
1

は、これらのようになります。

Person.cs

public int Id { get; set; } 
public string PersonName { get; set; } 
public string PersonLastName { get; set; } 
public string PersonPatronymic { get; set; } 

public ICollection<PersonsSignsHair> PersonsSignsHair { get; set; } 
public ICollection<PersonsSignsBodyType> PersonsSignsBodyType { get; set; } 

PersonsSignsHair.cs

public int Id { get; set; } 
public int PersonId { get; set; } 
public string PersonHair { get; set; } 

PersonsSignsBodyTypeを。CS

public int Id { get; set; } 
public int PersonId { get; set; } 
public string PersonBodyType { get; set; } 

そして、あなたはそのような状況があります:あなたはこの

entity.People.Where(x => x.Id == id).Include(y => y.PersonsSignsHair).Include(z => z.PersonsSignsBodyType).FirstOrDefault(); 
関連する問題