C# 用LINQ打印表格

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.

我是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.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();
   }

}