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)(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 ループの "response" 変数の型を見てください。ですLinqConsoleApplication.ResponseConsole.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のメソッドを暗黙的に呼び出し、のデフォルトの実装が単純に型の名前を返すためです。ToStringstringToString


これはうまくいくはずです:

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

于 2013-09-01T17:36:21.223 に答える