internal async Task <dynamic> Get_BookWordsWordsTranslations_DtoAsync(IEnumerable <int> bookWordIds)
        {
            var data = await BookWords.Where(t => bookWordIds.Contains(t.Id))
                       .Join(Words, bw => bw.WordId, w => w.Id, (bw, w) => new { bookWord = bw, word = w })
                       .Join(Translations, bww => bww.bookWord.Id, t => t.BookWordId, (bww, t) => new {
                translation = t,
                bookWord    = bww.bookWord,
                word        = bww.word
            })
                       .AsNoTracking().ToListAsync();

            return(new {
                words = data.Select(d => d.word).Distinct().Select(w => new WordDto(w)),
                bookWords = data.Select(d => d.bookWord).Distinct().Select(bw => new BookWordDto(bw)),
                translations = data.Select(d => d.translation).Distinct().Select(t => new TranslationDto(t))
            });
        }
        public async Task <Tuple <BookWord, Translation> > AddTranslation(int bookID, int wordID, string value, LanguageType language, SpeachPartType speachPart)
        {
            // . search for BookWord
            BookWord bookWordEntity = await BookWords.Include("Translations").SingleOrDefaultAsync(bw =>
                                                                                                   bw.BookId == bookID &&
                                                                                                   bw.WordId == wordID &&
                                                                                                   bw.SpeachPart == (int)speachPart);

            Translation translationEntity = null;

            if (bookWordEntity == null)
            {
                // . create BookWord if not exists
                bookWordEntity = new BookWord {
                    BookId     = bookID,
                    WordId     = wordID,
                    SpeachPart = (int)speachPart
                };
                BookWords.Add(bookWordEntity);
                await SaveChangesAsync();
            }
            else
            {
                // . search for Translation
                translationEntity = bookWordEntity.Translations.SingleOrDefault(t => t.Value == value &&
                                                                                t.Language == (int)language);
            }
            // . add Translation if not exists
            if (translationEntity == null)
            {
                translationEntity = new Translation {
                    BookWordId = bookWordEntity.Id,
                    Value      = value,
                    Language   = (byte)language
                };
                Translations.Add(translationEntity);
                await SaveChangesAsync();
            }
            return(new Tuple <BookWord, Translation>(bookWordEntity, translationEntity));
        }