UPDATE2 我开始更多地使用James建议使用反射并得到一些工作,它将返回基于字符串变量的属性值.我不想把它作为一个答案,但我觉得它可能不是最好的解决方案.这是代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
更新: 我正在取得进展!我认为.这可能是一个非常可怕的解决方案和资源匮乏,我还不确定,但它比我一直得到的空白屏幕更好.现在的问题是找到一种方法来返回值而不是字段名称.这是我的代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
无论其他字段如何,都会输出{first_name = JOHN,last_name = DOE}等.我希望我能找到一种方法来修改我的Select子句,只选择值.
我是一名新手程序员,尤其是C#的新手以及任何调用数据库的东西.这是我的第一个使用查询和数据库的项目,我遇到了基于动态查询成功返回结果的问题.
我已成功创建了一个将检索正确信息的查询,但我对如何访问检索到的特定字段感到困惑.
IEnumerable<myTable> userInfo = dataBase.ExecuteQuery<myTable>
("select " + Fields + " from myTable where userID in
(" + userNames + ")");
Run Code Online (Sandbox Code Playgroud)
编辑:请原谅我的错误命名约定,但myTable是类型:System.Collections.Generic.IEnumerable<DatabaseConnection.myTable>{System.Data.Linq.SqlClient.SqlProvider.OneTimeEnumerable<DatabaseConnection.myTable>}
这只是一个占位符名称,并在我的数据库中有一个特定的名称.它位于Tables文件夹XD中
myTable的类型为DatabaseConnection.Fields是我正在查找的一串字段,而userNames是一个由逗号分隔的多个用户名的字符串.示例:Fields ="firstName,lastName,idNumber"userNames ="John,Jane,Bob"
我的问题是,是否有可能在我正在返回的对象类型中为每个用户迭代每个字段?我只是这样明确地看到它:
foreach(var x in userinfo)
{
Console.Writeline(x.firstName);
}
Run Code Online (Sandbox Code Playgroud)
在我目前的情况下,这将不起作用,因为用户可能想要与特定用户名相关的其他字段.
我也尝试过使用Dynamic Linq Library,虽然我能够成功设置我的选择字符串,但我不确定当userID等于几个不同的字符串时如何正确设置我的where子句.(名称数量不会总是相同)
var dataInfo = dataBase.myTable
.Where("userID == @0", "(" + userIDs + ")")
.Select("New(" + fields + ")");
Run Code Online (Sandbox Code Playgroud)
我已经被困在这几天了.任何帮助将不胜感激.也许我认为解决方案太简单了?我觉得我应该可以在我的第一段代码中使用GetProperties()或类似的东西.
我也很抱歉,如果这已经得到回答,我的格式不佳(这里的第一篇文章).在我的研究期间,我无法找到我正在寻找的东西,或者我可能只是没有正确理解代码.再次感谢任何帮助!
编辑:所有这些都是我正在进行的Excel Addin.我需要将信息放入List或某种形式的对象中,这样我就可以将每个字段结果放入特定的单元格中.
编辑:对不起,如果我使用错误的术语.我觉得我的错误可能在我的Enumerable类型中并命名为"myTable"可能会令人困惑.它是从项目中的.dbml文件中的服务器资源管理器中提取的表.
编辑:在每个用户上运行查询并检索该用户名的每个请求字段,效率是多么低效/耗时?如果这只是我需要添加一个简单的循环,我会感到愚蠢.
如果我正确理解你的问题并且你只想迭代对象的所有属性(不知道它们在编译时是什么),你可以使用反射,例如
foreach (var prop in userInfo.GetType().GetProperties())
{
Console.WriteLine("Property name: " + prop.Name);
Console.WriteLine("Property value: " + prop.GetValue(userInfo, null));
}
Run Code Online (Sandbox Code Playgroud)