C# 用LINQ打印表格
我是LINQ编程的初学者,我想知道如何从控制台应用程序中使用LINQ打印SQL Server表中的所有数据。到目前为止,我所做的是创建一个名为Response的表,它有几个字段,我在SQLServerManagementStudio中设计了这个表,并编写了一个控制台C类来打印所有值。以下是我的代码:C# 用LINQ打印表格,c#,sql-server,linq,C#,Sql Server,Linq,我是LINQ编程的初学者,我想知道如何从控制台应用程序中使用LINQ打印SQL Server表中的所有数据。到目前为止,我所做的是创建一个名为Response的表,它有几个字段,我在SQLServerManagementStudio中设计了这个表,并编写了一个控制台C类来打印所有值。以下是我的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.
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.WriteLineresponse应该返回表中的所有select*,但事实似乎并非如此。有什么建议吗?我提出问题的方式有错误吗?我需要使用StringBuilder方法将每个字段附加到writeLine吗?在我们知道响应的内容以及您希望打印出来的内容之前,我们无法给您一个明确的答案,但是如果您希望保持Console.writeLine调用的原样,您应该在响应类中重写ToString方法,返回您希望看到打印的字符串
public override string ToString()
{
return string.Format("Property1: {0}\nProperty2: {1}\nProperty3: {2}",
this.Property1, this.Property2, this.Property3);
}
这是因为Console.WriteLine将对非字符串类型隐式调用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.WriteLineResponse的输出
在ToString覆盖中,您可以精确地指定每个属性的显示方式,例如{0:C2}将1打印为$1.00。您可能还需要使用\t tab来排列输出。查看foreach循环中响应变量的类型。这是LinqConsoleApplication.Response。将对象传递到Console.WriteLineobject方法时,将调用该对象的ToString方法。当调用对象的ToString方法而不显式重写它并实现自定义功能时,默认结果是以字符串形式获得完整的对象类型,例如LinqConsoleApplication.Response 您需要做的是在foreach循环中迭代以创建一个自定义字符串,该字符串由您感兴趣的对象的属性串联而成 例如:
foreach (Response response in responseData)
{
string responseString = response.SomeProperty1.ToString() + " " + response.SomeProperty2.ToString();
Console.WriteLine(responseString);
}
您可以使用反射来完成此操作。请确保您正在使用 系统反射
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();
}
}
Console.WriteLineresponse.Name;可能?Console.WriteLineresponse正在打印response.ToString,这是响应的类型名称。我认为您需要打印响应对象的属性。@rene,这将只返回name值,但我希望打印出所有字段的值。有什么建议吗?retailcoder,谢谢你的回答,你能再解释一下你的解决方案吗?试试看,你可能想编辑你的答案,以实际使用你正在构建的字符串。否则输出将保持不变…这就是我现在所做的,但是当一个表包含超过15个字段时,我能做什么?我会显式地将每个字段转换为字符串并打印它们吗?那将需要大量的代码编写,对吗?LINQ中是否没有DataTable概念可以返回表中所有字段的所有数据?这种方法涉及一个一次性字符串,每次需要将类型呈现为字符串时,您都必须重新键入所有内容或复制/粘贴。您只需执行一次,ToString会告诉系统类应如何将自身呈现为字符串。另一种方法是使用反射,这有点过分了。在这种情况下dataGridView.DataSource=dc.GetTable可以工作吗?如果是,那么我如何使用它来打印结果?您将使用与您在问题中发布的代码完全相同的代码!:实际上是控制台。写响应;我会在类型的ToString覆盖中这样做,否则它是一次性使用的。这个答案确实得到了所需的输出,但正如retailcoder所说,这可能有点过分了。非常感谢大家的指导。
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();
}
}