Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выбор данных из нескольких таблиц в одном запросе 
V
    Опции темы
kinder999
Дата 3.8.2010, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.6.2007

Репутация: нет
Всего: нет



Здравствуйте. Имеется несколько таблиц. К примеру, Question(id, name,type), Answers(id, idQ,name,ans). В таблице table2 idQ - это id из table1.
Есть массив с ID, необходимо в WCF Service  создать запрос  (данные получаются для Silverlight), который брал бы в одном запросы данные из обеих таблиц (было бы совсем замечательно, если можно было бы передать массив с ID). В последствии эти данные можно было бы разбить по массивам, например...
Сейчас понятно, как сделать два запроса к двум таблицам
Код

#region GetQuestionInfo(qID)
        [OperationContract]
        List<Question> GetQuestionInfo(int qID)
        {
            DCeLearningDataContext db = new DCeLearningDataContext();

            return db.Questions.Where(data => data.ID == qID).ToList();

        }
        #endregion

и 

#region GetAnswerList(idQ)
        [OperationContract]
        List<Answer> GetAnswerList(int idQ)
        {
            DCeLearningDataContext db = new DCeLearningDataContext();
            var result = from AnswerInfo in db.Answers
                         where AnswerInfo.idq == idQ
                         select AnswerInfo;
            return result.ToList();
        }
        #endregion
 
соответственно для разбивки в silvrelight используется:
Код

eLService.eLDBServiceClient ws = new elPlayer.eLService.eLDBServiceClient();
 ws.GetQuestionInfoCompleted += new EventHandler<elPlayer.eLService.GetQuestionInfoCompletedEventArgs>(ws_GetQuestionInfoCompletedFD);
ws.GetQuestionInfoAsync(qID);

private void ws_GetQuestionInfoCompletedFD(object sender, elPlayer.eLService.GetQuestionInfoCompletedEventArgs e)
        {
string[] QText = e.Result.Select(d => d.name).ToArray();
}


Заранее спасибо за помощь...
PM MAIL   Вверх
KelTron
Дата 3.8.2010, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 2
Всего: 38



Не совсем понятен этот код:
Код

List<Question> GetQuestionInfo(int qID)
        {
            DCeLearningDataContext db = new DCeLearningDataContext();

            return db.Questions.Where(data => data.ID == qID).ToList();

        }

Если id - первичный ключ, то должен возвращаться один элемент, а не коллекция, т.к. ключ уникален..
Код

     Question GetQuestionInfo(int qID)
        {
            DCeLearningDataContext db = new DCeLearningDataContext();

            return db.Questions.SingleOrDefault(data => data.ID == qID);
        }


По сабжу, если я правильно понял то тебе нужно это:
Код

List<Question> GetQuestions(int[] qIDs)
{
    DCeLearningDataContext db = new DCeLearningDataContext();
    var dl = new DataLoadOptions();
    dl.LoadWith<Question>(q => q.Answer);// указываем, что при загрузке Question должны загружаться также и Answer
    db.LoadOptions = dl;

    return db.Questions
        .Where(data => qIDs.Contains(data.ID)) // получаем Question-ы с ID из массива qIDs
        .ToList();
}

В итоге получим коллекцию объектов Question, у каждого из которых есть коллекция объектов Answer. Конечно при условии что свойства у тебя называются также.



Это сообщение отредактировал(а) KelTron - 3.8.2010, 12:31


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
kinder999
Дата 3.8.2010, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.6.2007

Репутация: нет
Всего: нет



Цитата(KelTron @  3.8.2010,  12:30 Найти цитируемый пост)
Если id - первичный ключ, то должен возвращаться один элемент, а не коллекция, т.к. ключ уникален..

В таблице Question - одна запись с таким ключом, в таблице Answers может быть несколько строк с таким idQ.
Мне нужно выбрать в одном запросе строку из таблицы Question, где есть id = qID, и несколько строк (те которые удовлетворяют условию idQ = qID) из таблицы Answers. При этом необходимо в самом приложении разобрать возвращённые строки по столбцам.
Это выглядит так для таблицы Question
Код

string[] Qname = e.Result.Select(d => d.name).ToArray();

а для таблицы Answers хотелось бы сделать по аналогии
Код

string[] Answer1 = e.Result.Select(d => d.name).ToArray();
string[] Answer2 = e.Result.Select(d => d.ans).ToArray();

пока получается сделать в разных запросах

WCF
Код

#region GetQuestionInfo(qID)
        [OperationContract]
        List<Question> GetQuestionInfo(int qID)
        {
            DCeLearningDataContext db = new DCeLearningDataContext();

            return db.Questions.Where(data => data.ID == qID).ToList();

        }
        #endregion

#region GetAnswerList(idQ)
        [OperationContract]
        List<Answer> GetAnswerList(int idQ)
        {
            DCeLearningDataContext db = new DCeLearningDataContext();

            return db.Answers.Where(data => data.idq == idQ).ToList();
        }
        #endregion

соответственно в приложении Silverlight
Код

private void GetFullData(int qID)
        {
            eLService.eLDBServiceClient ws = new elPlayer.eLService.eLDBServiceClient();
            ws.GetQuestionInfoCompleted += new EventHandler<elPlayer.eLService.GetQuestionInfoCompletedEventArgs>(ws_GetQuestionInfoCompletedFD);
            ws.GetAnswerListCompleted += new EventHandler<elPlayer.eLService.GetAnswerListCompletedEventArgs>(ws_GetAnswerListCompletedFD);
            ws.GetQuestionInfoAsync(qID);
            ws.GetAnswerListAsync(qID);
        }

private void ws_GetQuestionInfoCompletedFD(object sender, elPlayer.eLService.GetQuestionInfoCompletedEventArgs e)
        {
            string[] QText = e.Result.Select(d => d.name).ToArray();
        }

private void ws_GetAnswerListCompletedFD(object sender, elPlayer.eLService.GetAnswerListCompletedEventArgs e)
        {
            string[] AnswerList = e.Result.Select(d => d.textA).ToArray();
            string[] ans = e.Result.Select(d => d.ans1.ToString()).ToArray();
}



При использовании в WCF
Код

#region GetQInfo(qID)
        [OperationContract]
        List<Question> GetQInfo(int[] qID)
        {
            DCeLearningDataContext db = new DCeLearningDataContext();
            var d1 = new DataLoadOptions();
            d1.LoadWith<Question>(q => q.Answers);
            db.LoadOptions = d1;
            return db.Questions.Where(data => qID.Contains(data.ID)).ToList();

        }
        #endregion

и в приложении
Код

private void GetData(int[] qIDs)
        {
            eLService.eLDBServiceClient ws = new elPlayer.eLService.eLDBServiceClient();
            ws.GetQInfoCompleted += new EventHandler<elPlayer.eLService.GetQInfoCompletedEventArgs>(ws_GetQInfoCompleted);
            ws.GetQInfoAsync(qIDs);
        }
void ws_GetQInfoCompleted(object sender, elPlayer.eLService.GetQInfoCompletedEventArgs e)
        {
            string[] Qname = e.Result.Select(d => d.TextQ).ToArray();
        }


выводится ошибка

Код

The best overloaded method match for 'elPlayer.eLService.eLDBServiceClient.GetQInfoAsync(System.Collections.ObjectModel.ObservableCollection<int>)' has some invalid arguments
Argument '1': cannot convert from 'int[]' to 'System.Collections.ObjectModel.ObservableCollection<int>'



Это сообщение отредактировал(а) kinder999 - 3.8.2010, 13:11
PM MAIL   Вверх
KelTron
Дата 3.8.2010, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 2
Всего: 38



Цитата(kinder999 @  3.8.2010,  13:03 Найти цитируемый пост)
Мне нужно выбрать в одном запросе строку из таблицы Question, где есть id = qID, и несколько строк (те которые удовлетворяют условию idQ = qID) из таблицы Answers. 

Код

Question GetQuestionInfo(int qID)
        {
            DCeLearningDataContext db = new DCeLearningDataContext();
            var dl = new DataLoadOptions();
            dl.LoadWith<Question>(q => q.Answer);
            db.LoadOptions = dl;

            return db.Questions.SingleOrDefault(data => data.ID == qID);
        }

Как я уже писал dl.LoadWith<Question>(q => q.Answer); - говорит о том, что вместе со строкой Question загрузятся строки (те которые удовлетворяют условию idQ = qID) из таблицы Answers.

Цитата(kinder999 @  3.8.2010,  13:03 Найти цитируемый пост)
Это выглядит так для таблицы Questionкод C#1:string[] Qname = e.Result.Select(d => d.name).ToArray();highlightSyntax('csharp_A1YmU','csharp');а для таблицы Answers хотелось бы сделать по аналогиикод C#1:2:string[] Answer1 = e.Result.Select(d => d.name).ToArray();string[] Answer2 = e.Result.Select(d => d.ans).ToArray();highlightSyntax('csharp_N2E1ZW','csharp');

Код

string Qname = e.Result.name; // здесь не массив, потому что мы получили только 1 Question, но у него коллекция Answer
string[] Answer1 = e.Result.Answer.Select(d => d.name).ToArray();
string[] Answer2 = e.Result.Answer.Select(d => d.ans).ToArray();


Цитата(kinder999 @  3.8.2010,  13:03 Найти цитируемый пост)
выводится ошибкакод C#1:2:The best overloaded method match for 'elPlayer.eLService.eLDBServiceClient.GetQInfoAsync(System.Collections.ObjectModel.ObservableCollection<int>)' has some invalid argumentsArgument '1': cannot convert from 'int[]' to 'System.Collections.ObjectModel.ObservableCollection<int>'highlightSyntax('csharp_M1ZTcy','csharp');

Не должно быть такого, значит где то в другом месте что то не так..




--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
kinder999
Дата 5.8.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.6.2007

Репутация: нет
Всего: нет



Спасибо. Получилось реализовать при передаче по одному ID...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




[ Время генерации скрипта: 0.0990 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.