使用LINQ打印表格
本文关键字:表格 打印 LINQ 使用 | 更新日期: 2023-09-27 18:29:53
我是LINQ编程的初学者,我想知道如何从控制台应用程序使用LINQ打印表(在SQL Server中)中的所有数据。到目前为止,我所做的是创建一个名为Response的表,该表有几个字段(我在SQLServerManagementStudio中设计了该表),并编写了一个控制台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)
应该从表中返回EVERYTHING(select*),但事实并非如此。有什么建议吗?我构建查询的方式有错误吗?我是否需要使用StringBuilder方法将每个字段附加到writeLine()
?
您可以使用反射来完成此操作。确保您正在使用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();
}
}
查看foreach循环中"response"变量的类型。它是LinqConsoleApplication.Response
。当一个对象被传递给Console.WriteLine(object)
方法时,该对象的ToString()
方法被调用。当您调用对象的ToString()
方法而不显式重写它并实现自定义函数时,默认结果是您获得完整的对象类型作为字符串,例如"LinqConsoleApplication.Response"
。
您需要做的是在foreach循环中迭代以创建一个自定义字符串,该字符串是通过连接您感兴趣的对象的属性来创建的。
例如:
foreach (Response response in responseData)
{
string responseString = response.SomeProperty1.ToString() + " " + response.SomeProperty2.ToString();
Console.WriteLine(responseString);
}
在我们知道Response
是由什么组成以及您想从中打印出什么之前,我们无法给您一个明确的答案,但如果您想保持Console.WriteLine
调用的原样,则应该重写Response
类中的ToString()
方法,以返回您希望打印的字符串。
public override string ToString()
{
return string.Format("Property1: {0}'nProperty2: {1}'nProperty3: {2}",
this.Property1, this.Property2, this.Property3);
}
这是因为Console.WriteLine
将在非string
的类型上隐式调用ToString
方法,而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
(选项卡)来排列输出。