使用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()

使用LINQ打印表格

您可以使用反射来完成此操作。确保您正在使用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(选项卡)来排列输出。