#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