2013-09-01 5 views
1

저는 LINQ로 프로그래밍하는 초보자이며 콘솔 응용 프로그램에서 LINQ를 사용하여 SQL Server의 테이블에서 모든 데이터를 인쇄 할 수있는 방법을 알고 싶습니다. 지금까지 내가해온 것은 SQL Server Management Studio에서 테이블을 디자인 한 여러 필드가있는 Response라는 테이블을 만들고 모든 값을 출력하는 콘솔 C# 클래스를 작성한 것입니다. 여기 내 코드는 그것을 위해이다 :LINQ를 사용하여 테이블 인쇄

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) (선택 *) 테이블에서 모든 반환해야한다고 발견했습니다,하지만 그 경우되지 않는 것 같습니다. 어떤 제안을 해주시겠습니까? 쿼리의 프레임에 오류가 있습니까? writeLine()에 모든 필드를 추가하려면 StringBuilder 메서드를 사용해야합니까?

+1

Console.WriteLine (response.Name); 아마도? – rene

+0

'Console.WriteLine (response)'는'Response.ToString()'을 출력합니다. 이것은'Response'의 타입 이름입니다. 나는 당신이 당신의'response' 객체의 * 속성 *을 인쇄 할 필요가 있다고 생각합니다. –

+0

@rene, 그 이름 값을 반환하지만 모든 필드의 값을 인쇄 싶습니다. 어떤 제안? –

답변

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

} 
+0

형식의 ToString 재정의에서 그렇게 할 것입니다. 그렇지 않으면 단일 용도입니다. –

+0

이 대답은 원하는 출력을 얻지 만 retailcoder에서 말한 것처럼 지나치게 과장 될 수 있습니다. 지도를 주신 모든 분들께 감사드립니다. –

0

우리는 당신이 그것을 밖으로 인쇄하고 싶은 것을 Response이 이루어지고, 알 때까지 우리는 당신에게 확실한 대답을 줄 수는 없지만, 당신이 정확히로 Console.WriteLine 전화를 유지하려는 경우, 당신은 오버라이드 (override) Response 클래스의 ToString() 메서드를 사용하여 인쇄하려는 문자열을 반환하십시오. Console.WriteLine가 암시 적으로 string 아니다 유형에 ToString 메소드를 호출하고, ToString의 기본 구현은 단순히 유형의 이름을 반환하기 때문에입니다

public override string ToString() 
{ 
    return string.Format("Property1: {0}\nProperty2: {1}\nProperty3: {2}", 
         this.Property1, this.Property2, this.Property3); 
} 

.


이 작동합니다 :

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 
    } 
} 

출력하여 ToString 재정에서 Console.WriteLine(Response);

ResponseID: 1 
StatusID: 123 
Title: This is the title 
ProjectID: 1 
SourceID: 456 
SourceTitle: This is the source title 

지정할 수 정확히 당신이 예를 들어 {0:C2}는 것, 각 속성을 표시하는 방법 1$1.00으로 인쇄하십시오. 또한 \t (탭)을 사용하여 출력을 정렬 할 수 있습니다.

+0

그럼 한 번만 할 것입니다. ToString은 클래스에 문자열을 렌더링하는 방법을 알려줍니다. 대안은 반사를 사용하는 것입니다. imho는 약간의 과잉입니다. –

+0

이 경우 dataGridView.DataSource = dc.GetTable 을 사용할 수 있습니까? 그렇다면 어떻게 그 결과를 출력 할 수 있습니까? –

+0

질문에 올린 것과 똑같은 코드를 사용하십시오! :) –

1

foreach 루프에서 "응답"변수 유형을 확인하십시오. LinqConsoleApplication.Response입니다. 개체가 Console.WriteLine(object) 메서드에 전달되면 ToString() 메서드가 해당 개체에 호출됩니다. 명시 적으로 재정의하거나 사용자 정의 functionallity를 구현하지 않고 객체의 ToString() 메소드를 호출하면 기본적으로 전체 객체 유형을 문자열로 가져옵니다. "LinqConsoleApplication.Response". 당신이에 관심이있는 개체의 속성에 연결하여 만든 사용자 정의 문자열을 만들기 위해 foreach 루프에서 반복하는 동안 당신이해야 할 일은

는 예를 들어

:.

foreach (Response response in responseData) 
      { 
       string responseString = response.SomeProperty1.ToString() + " " + response.SomeProperty2.ToString(); 
       Console.WriteLine(responseString); 
      } 
+0

당신이 만들고있는 문자열을 실제로 * 사용 *하기 위해 답을 편집하고 싶을 수도 있습니다. 그렇지 않으면 출력이 변경되지 않습니다 ... –

+0

지금까지 해본 것이지만 테이블에 15 개가 넘는 필드가있을 때 어떻게해야합니까? 명시 적으로 각 필드를 toString()으로 변환하여 인쇄했을 것인가? 그것은 많은 코드 작성이 될 것입니다, 그렇죠? 테이블에서 모든 필드에 대한 모든 데이터를 반환 할 수있는 DataTable 개념이 LINQ에 있습니까? –

+0

이 방법은 일회용 문자열을 포함하므로 유형을 문자열로 렌더링해야 할 때마다 모든 것을 다시 입력하거나 복사/붙여 넣기해야합니다. –

관련 문제