1

我是 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)应该从表中返回 EVERYTHING (select *),但似乎并非如此。请问有什么建议吗?我构建查询的方式是否有错误?我是否需要使用 StringBuilder 方法将每个字段附加到writeLine()?

4

3 回答 3

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

}
于 2013-09-01T17:47:47.350 回答
1

查看 foreach 循环中“响应”变量的类型。是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);
            }
于 2013-09-01T17:43:45.093 回答
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不是 a 的类型的方法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(tab) 来排列输出。

于 2013-09-01T17:36:21.223 回答