Запрос LinQ с несколькими таблицами и извлечением данных

#c# #linq

#c# #linq

Вопрос:

Я выполняю запрос к внутреннему объединению 4 таблиц, и мне нужно извлечь данные, преобразовать в строку и поместить их в массив для этого.

     var query = from a in context.as
                            join b in context.bs on a.prikey equals b.forkey
                            join c in context.cs on b.prikey equals c.forkey
                            join d in context.ds on c.prikey equals d.forkey
                            where b.gender == gender
                            where c.age == age
                            select new
                            {
                                a.Name,
                                a.Age,
                                b.Gender,
                            };
string[] results = new string[] {}
return results;
  

Обычно, если задействована одна таблица
, a as = множественное число таблицы a

 as t = query.First() 
string[] results = new string[] {t.Name, t.Age, t.Gender}
return results;
  

Мне не хватает шага для извлечения данных.

Комментарии:

1. as = множественное число таблицы a как t = запрос. Первая () строка [] результаты = новая строка[] {т.firstval, т.secondval} не уверен, что мне заполнить ‘как’

Ответ №1:

Это зависит от того, что именно вы хотите сделать с данными. Ваш код на самом деле не будет компилироваться в данный момент, поскольку он пытается создать анонимный тип с несколькими свойствами, все из которых называются «arg», но я предполагаю, что у вас действительно есть более разумный запрос.

В конечном счете, тот факт, что вы используете несколько таблиц, здесь не имеет значения — вы получаете только один элемент результата за раз: тот факт, что каждый элемент результата содержит данные из нескольких таблиц, не имеет значения ни здесь, ни там с точки зрения того, как вы к нему обращаетесь.

Теперь я только что заметил, что вы говорите, что хотите «извлечь данные и преобразовать в строку». Если возможно, вы должны указать это в своем запросе. Возможно, вы сможете сделать это в базе данных, или вам может потребоваться принудительно выполнить заключительную часть выполнения локально, например:

 // Not executed yet!
var dbQuery = from a in context.a
              join b in context.bs on a.prikey equals b.forkey
              join c in context.cs on b.prikey equals c.forkey
              join d in context.ds on c.prikey equals d.forkey
              where ...
              select { a.Age, b.Name, c.Salary, d.Location };

// This still won't talk to the database!
var finalQuery = dbQuery.AsEnumerable()
                        .Select(x => string.format("Age: {0}; Name: {1}; "  
                                                   "Salary: {2}; Location: {3}",
                                                   x.Age, x.Name, x.Salary,
                                                   x.Location));

// This will finally execute the query
string[] results = finalQuery.ToArray();
  

Теперь вам не нужно делать это так, но это, вероятно, лучший подход, по крайней мере, с тем объемом информации, который вы нам предоставили. Если вы можете рассказать нам больше о том, как вы пытаетесь объединить данные из нескольких таблиц, возможно, мы сможем вам больше помочь.

РЕДАКТИРОВАТЬ: Хорошо, теперь вы дали нам немного больше информации, я подозреваю, что вы хотите:

 var query = from a in context.a
            join b in context.bs on a.prikey equals b.forkey
            join c in context.cs on b.prikey equals c.forkey
            join d in context.ds on c.prikey equals d.forkey
            where ...
            select new string[] { a.arg, b.arg, c.arg, d.arg };

 string[] results = query.First();
  

Я не пробовал создавать массивы в LINQ to SQL … это может сработать, или вам может потребоваться использовать анонимный тип и AsEnumerable в соответствии с предыдущей частью моего ответа.

Вы также должны подумать о том, что вы хотите, чтобы произошло, если результатов нет или несколько результатов.

РЕДАКТИРОВАТЬ: увидев отредактированный вопрос, вы действительно можете обрабатывать несколько таблиц так же, как одну таблицу. Вы бы использовали точно такой же код для обработки результата, как только он был спроецирован в анонимный тип:

 var query = from a in context.as
            join b in context.bs on a.prikey equals b.forkey
            join c in context.cs on b.prikey equals c.forkey
            join d in context.ds on c.prikey equals d.forkey
            where ... 
            select new { a.Name, a.Age, b.Gender };

var result = query.First();
// Call ToString appropriately on each property, of course
string[] array = new string[] { result.Name, result.Age, result.Gender };
  

Комментарии:

1. я хотел бы получить данные из оператора select из a.arg, a.arg, b.arg, c.arg, d.arg. я бы на самом деле сделал a as = множественное число таблицы a как t = query . Первая () строка[] результаты = новая строка[] {т.firstval, т.secondval} не уверен, что мне заполнить ‘как’.

2. @vinz: О, я понимаю… Я думаю. Это несколько неясно или, по крайней мере, необычно. В любом случае, будет редактировать.

3. @vinz: Хорошо, теперь смотрите нижнюю часть моего ответа. Обратите внимание, что where предложения в вашем примере запроса довольно бессмысленны, поскольку на данный момент вы просто гарантируете, что получите массив строк { arg, arg, arg, arg} , поскольку вы отфильтровали их именно по этому критерию… вот где предоставление реалистичных примеров имеет большое значение.

4. где нужно отфильтровать запрос с помощью внешнего фактора. .Сначала говорится, что он работает с IQueryable. Я работаю над веб-формой, а не над подходом MVC.

5. @vinz Но ваш образец запроса фильтрует точные совпадения выбранных вами данных. Надеюсь, ваш реальный запрос более разумный. Используете ли вы MVC или нет, не имеет значения.

Ответ №2:

 var query = from a in context.a
                            join b in context.bs on a.prikey equals b.forkey
                            join c in context.cs on b.prikey equals c.forkey
                            join d in context.ds on c.prikey equals d.forkey
                            where a.arg == arg
                            where b.arg == arg
                            where c.arg == arg
                            select new
                            {
                               allStrings =  a.arg  
                                a.arg  
                                b.arg  
                                c.arg  
                                d.arg 
                            };
string[] results = query.ToArray();
  

Комментарии:

1. что вы подразумеваете под allStrings? переменная?

2. @vinz: Да, проецируя результаты во временную переменную allStrings