익명 형식을 반환하는 쿼리가 있고 쿼리가 메서드에 있습니다. 이것을 어떻게 작성합니까?
public "TheAnonymousType" TheMethod(SomeParameter)
{
using (MyDC TheDC = new MyDC())
{
var TheQueryFromDB = (....
select new { SomeVariable = ....,
AnotherVariable = ....}
).ToList();
return "TheAnonymousType";
}
}
답변
당신은 할 수 없습니다.
당신은 반환 할 수 있습니다 object
, 예를 들어, 또는 객체의 용기 IEnumerable<object>
, IList<object>
등
답변
dynamic
익명 유형의 런타임 확인 버전을 제공하지만 .NET 4+에서만 반환 할 수 있습니다.
답변
C # 7에서는 튜플을 사용하여이를 수행 할 수 있습니다.
public List<(int SomeVariable, string AnotherVariable)> TheMethod(SomeParameter)
{
using (MyDC TheDC = new MyDC())
{
var TheQueryFromDB = (....
select new { SomeVariable = ....,
AnotherVariable = ....}
).ToList();
return TheQueryFromDB
.Select(s => (
SomeVariable = s.SomeVariable,
AnotherVariable = s.AnotherVariable))
.ToList();
}
}
System.ValueTuple
그래도 너겟 패키지 를 설치해야 할 수도 있습니다 .
답변
익명 형식은 반환 할 수 없습니다. 반환 할 수있는 모델을 만들 수 있습니까? 그렇지 않으면 object
.
다음은 주제에 대해 Jon Skeet이 작성한 기사입니다.
기사의 코드 :
using System;
static class GrottyHacks
{
internal static T Cast<T>(object target, T example)
{
return (T) target;
}
}
class CheesecakeFactory
{
static object CreateCheesecake()
{
return new { Fruit="Strawberry", Topping="Chocolate" };
}
static void Main()
{
object weaklyTyped = CreateCheesecake();
var stronglyTyped = GrottyHacks.Cast(weaklyTyped,
new { Fruit="", Topping="" });
Console.WriteLine("Cheesecake: {0} ({1})",
stronglyTyped.Fruit, stronglyTyped.Topping);
}
}
또는 다른 사람들이 댓글을 작성할 때 다음을 사용할 수 있습니다. dynamic
답변
반환이 필요한 경우 익명 형식 대신 Tuple 클래스를 사용할 수 있습니다.
참고 : 튜플은 최대 8 개의 매개 변수를 가질 수 있습니다.
return Tuple.Create(variable1, variable2);
또는 원본 게시물의 예 :
public List<Tuple<SomeType, AnotherType>> TheMethod(SomeParameter)
{
using (MyDC TheDC = new MyDC())
{
var TheQueryFromDB = (....
select Tuple.Create(..., ...)
).ToList();
return TheQueryFromDB.ToList();
}
}
http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx
답변
C # 컴파일러는 2 단계 컴파일러입니다. 첫 번째 단계에서는 네임 스페이스, 클래스 계층 구조, 메서드 서명 등 만 확인합니다. 메서드 본문은 두 번째 단계에서만 컴파일됩니다.
익명 형식은 메서드 본문이 컴파일 될 때까지 결정되지 않습니다.
따라서 컴파일러는 첫 번째 단계에서 메서드의 반환 유형을 결정할 방법이 없습니다.
이것이 익명 유형을 반환 유형으로 사용할 수없는 이유입니다.
.net 4.0 또는 grater를 사용하는 경우 다른 사람들이 제안했듯이 Dynamic
.
내가 당신이라면 아마도 유형을 만들고 메서드에서 해당 유형을 반환 할 것입니다. 이렇게하면 코드를 유지하고 더 읽기 쉬운 미래의 프로그래머가 쉽게 사용할 수 있습니다.
답변
세 가지 옵션 :
옵션 1:
public class TheRepresentativeType {
public ... SomeVariable {get;set;}
public ... AnotherVariable {get;set;}
}
public IEnumerable<TheRepresentativeType> TheMethod(SomeParameter)
{
using (MyDC TheDC = new MyDC())
{
var TheQueryFromDB = (....
select new TheRepresentativeType{ SomeVariable = ....,
AnotherVariable = ....}
).ToList();
return TheQueryFromDB;
}
}
옵션 2 :
public IEnumerable TheMethod(SomeParameter)
{
using (MyDC TheDC = new MyDC())
{
var TheQueryFromDB = (....
select new TheRepresentativeType{ SomeVariable = ....,
AnotherVariable = ....}
).ToList();
return TheQueryFromDB;
}
}
객체로 반복 할 수 있습니다.
옵션 3 :
public IEnumerable<dynamic> TheMethod(SomeParameter)
{
using (MyDC TheDC = new MyDC())
{
var TheQueryFromDB = (....
select new TheRepresentativeType{ SomeVariable = ....,
AnotherVariable = ....}
).ToList();
return TheQueryFromDB; //You may need to call .Cast<dynamic>(), but I'm not sure
}
}
동적 개체로 반복하고 속성에 직접 액세스 할 수 있습니다.