我是LINQ编程的初学者,我想知道如何使用控制台应用程序中的LINQ从表(在SQL Server中)打印所有数据。到目前为止我所做的是创建一个名为Response的表,它有几个字段(我在SQL Server Management Studio中设计了表)并编写了一个控制台C#类来打印所有值。这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LinqConsoleApplication
{
class Program
{
static void Main(string[] args)
{
using (DatabaseDBDataContext responses = new DatabaseDBDataContext())
{
IEnumerable<Response> responses = from response in responses.Responses select response;
foreach (Response response in responses)
{
Console.WriteLine(response);
}
Console.ReadKey();
}
}
}
}
但是,当我在cmd中运行它时,我将其作为输出:
LinqConsoleApplication.Response
LinqConsoleApplication.Response
从谷歌上搜索一些解决方案,我发现Console.WriteLine(response)
应该从表中返回一切(select *),但情况似乎并非如此。有什么建议吗?我构建查询的方式是否有错误?我是否需要使用StringBuilder方法将每个字段附加到writeLine()
?
答案 0 :(得分:2)
你可以使用反射来做到这一点。确保你正在使用 的System.Reflection。
static void Main(string[] args)
{
using (AcumenProjectsDBDataContext acumenResponse = new AcumenProjectsDBDataContext())
{
IEnumerable<Response> responseData = from response in acumenResponse.Responses select response;
//added code
foreach (Response response in responseData)
{
foreach (PropertyInfo prop in response.GetType().GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
{
object value = prop.GetValue(response, new object[] { });
Console.WriteLine("{0} = {1}", prop.Name, value);
}
}
Console.ReadKey();
}
}
答案 1 :(得分:1)
查看foreach循环中“response”变量的类型。它是LinqConsoleApplication.Response
。将对象传递给Console.WriteLine(object)
方法时,将调用该对象的ToString()
方法。当您调用对象的ToString()
方法而不显式覆盖它并实现自定义函数时,默认结果是您将完整对象类型作为字符串获取,例如"LinqConsoleApplication.Response"
。
您需要做的是在foreach循环中迭代以创建自定义字符串,该字符串由您感兴趣的对象属性的串联创建。</ p>
例如:
foreach (Response response in responseData)
{
string responseString = response.SomeProperty1.ToString() + " " + response.SomeProperty2.ToString();
Console.WriteLine(responseString);
}
答案 2 :(得分:0)
在我们知道Response
的内容以及您想要打印出来的内容之前,我们无法给您一个明确的答案,但是如果您想完全保留Console.WriteLine
来电话实际上,您应该覆盖ToString()
类中的Response
方法,以返回您希望看到的字符串。
public override string ToString()
{
return string.Format("Property1: {0}\nProperty2: {1}\nProperty3: {2}",
this.Property1, this.Property2, this.Property3);
}
这是因为Console.WriteLine
会在非ToString
的类型上隐式调用string
方法,而ToString
的默认实现只返回类型的名称。
这应该有效:
public class Response
{
...
public override string ToString()
{
return string.Format("ResponseID: {0}\nStatusID: {1}\nTitle: {2}\nProjectID: {3}\nSourceID: {4}\nSourceTitle: {5}\n...",
ResponseID, StatusID, Title, ProjectID, SourceID, SourceTitle);
// no need to call .ToString() on integer properties here, it's called implicitly anyway
}
}
Console.WriteLine(Response);
ResponseID: 1
StatusID: 123
Title: This is the title
ProjectID: 1
SourceID: 456
SourceTitle: This is the source title
在ToString
覆盖中,您可以准确指定希望每个媒体资源显示的 ,例如{0:C2}
将1
打印为$1.00
。您也可以使用\t
(制表符)排列输出。