UPDATE2 Я начал играть больше с предложением Джеймса использовать рефлексию и получил что-то работающее, которое вернет значение свойства на основе строковой переменной. Я не хочу ставить это как ответ, хотя, как я считаю, это, вероятно, не лучшее решение. Вот код:
DataContext dataBase = new DataContext();
List<string> listOfFields = new List<string>;
List<string> listOfUsers = new List<string>
//strFields and strNames are strings generated from listOfFields and listOfUsers
IEnumerable<myUserData> userInfo = dataBase.ExecuteQuery<myUserData>
("select " + strFields + " from myUserData where user_id in (" + strNames + ")");
foreach(var user in userInfo)
{
foreach(string field in listOfFields)
{
string fieldValue = user.GetType().GetProperty(field).GetValue(user,null).ToString
Console.WriteLine(fieldValue);
}
}
UPDATE: Я добиваюсь прогресса! Я думаю. Это может быть очень страшное решение и ресурсный боров, я еще не уверен, но это лучше, чем пустые экраны, которые я получал. Теперь проблема заключается в том, чтобы найти способ просто вернуть значения, а не имя поля с ним. Вот мой код:
foreach(string userID in listOfUserIDs)
{
//dataBase is a Datacontext
var userInfo = dataBase.myTable
.Where("user_id == @0", userID)
.Select("New(" + strFields + ")");
foreach(var user in userInfo)
{
Console.WriteLine(user);
}
}
Это выводит {first_name = JOHN, last_name = DOE} и т.д. любые другие поля. Я надеюсь, что смогу найти способ изменить предложение Select, чтобы просто выбрать значения.
Я новичок программист и особенно новичок в С# и все, что вызывает базы данных. Это мой первый проект, работающий с запросами и базами данных, и у меня возникают проблемы с успешным возвратом результатов на основе динамического запроса.
Я успешно создал запрос, который будет получать правильную информацию, но я не понимаю, как получить доступ к определенным полям, которые были получены.
IEnumerable<myTable> userInfo = dataBase.ExecuteQuery<myTable>
("select " + Fields + " from myTable where userID in
(" + userNames + ")");
РЕДАКТИРОВАТЬ: Извините за мои плохие соглашения об именах, но myTable имеет тип: System.Collections.Generic.IEnumerable<DatabaseConnection.myTable>{System.Data.Linq.SqlClient.SqlProvider.OneTimeEnumerable<DatabaseConnection.myTable>}
Это просто имя владельца места и имеет определенное имя в моей базе данных. Это было внутри папки Tables XD
myTable имеет тип класса DatabaseConnection. Поля - это строка полей, которые я просматриваю, а userNames - это строка из нескольких имен пользователей, каждая из которых разделена запятой. Примеры: Поля = "firstName, lastName, idNumber" userNames = "Джон, Джейн, Боб"
Мой вопрос: возможно ли перебирать каждое из полей для каждого пользователя в типе объекта, который я сейчас возвращаю? Я видел, как это было сделано явно:
foreach(var x in userinfo)
{
Console.Writeline(x.firstName);
}
В моей текущей ситуации это не сработает, так как пользователю могут понадобиться другие поля, относящиеся к конкретным именам пользователей.
Я также пробовал использовать динамическую библиотеку Linq, и, хотя мне удалось успешно настроить мою строку выбора, я не уверен, как правильно перейти к настройке предложения where, когда userID будет равен нескольким различным строкам. (число имен не всегда будет одинаковым)
var dataInfo = dataBase.myTable
.Where("userID == @0", "(" + userIDs + ")")
.Select("New(" + fields + ")");
Я застрял на этом уже несколько дней. Любая помощь будет принята с благодарностью. Может быть, я думаю, что решение слишком просто для этого? Я чувствую, что должен иметь возможность использовать GetProperties() или что-то похожее в моем первом бите кода.
Мне также очень жаль, если на это был дан ответ и мое плохое форматирование (первый пост здесь). Во время моего исследования я не смог найти то, что искал, или, возможно, просто неправильно понимаю код. Еще раз спасибо за любую помощь!
EDIT: Все это для Excel Addin, над которым я сейчас работаю. Мне нужно будет получить информацию в List или какой-либо форме объекта, который позволит мне помещать каждый результат поля в определенную ячейку.
EDIT: Извините, если я использую неправильную терминологию. Я чувствую, что моя ошибка может быть в моем перечислимом типе и называть ее "myTable" может быть запутанной. Это таблица, извлеченная из моего Server Explorer в моем .dbml файле в проекте.
РЕДАКТИРОВАТЬ: Насколько ужасно неэффективным/трудоемким является выполнение запроса для каждого отдельного пользователя и получение каждого запрошенного поля для этого имени пользователя? Я буду чувствовать себя глупо, если это то, что мне просто нужно, чтобы добавить простой цикл.