2016-09-08 4 views
0

다른 레이어에 코드를 넣어야하는 프로젝트가 있는데이 때문에 linq 쿼리를 메서드로 전송해야합니다. 이 코드 :동적 유형 속성을 가져 오는 방법은 무엇입니까?

var HRPersonnelContactInfoTelService = App.Api.HRPersonnelContactInfoTelService.Instance().Data(); 
     var SMSGroupMemberService = App.Api.SMSGroupMemberService.Instance().Data(); 
     return (from x in SMSGroupMemberService 
       where Recivers.Contains(x.GroupID) 
       join v in HRPersonnelContactInfoTelService on x.Pers_Code equals v.Pers_Code 
       select new { Pers_Code = (int)x.Pers_Code, Tel = v.Tel }).ToList(); 

나는에 코드를 변환 :

public dynamic HRPersonnelContactInfoTelMethod(List<int> Recivers) 
    { 
     var HRPersonnelContactInfoTelService = App.Api.HRPersonnelContactInfoTelService.Instance().Data(); 
     var SMSGroupMemberService = App.Api.SMSGroupMemberService.Instance().Data(); 
     return (from x in SMSGroupMemberService 
       where Recivers.Contains(x.GroupID) 
       join v in HRPersonnelContactInfoTelService on x.Pers_Code equals v.Pers_Code 
       select new { Pers_Code = (int)x.Pers_Code, Tel = v.Tel }).ToList(); 
    } 

하지만 난 foreach 문에서 사용할 때

유형 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'의 예외 System.Core.dll에서 발생했지만 사용자 코드에서 처리되지 않았습니다.

추가 정보 : 'object'do ES

이처럼 사용 'Pers_Code'에 대한 정의를 포함하지 :

var q = App.Api.HRPersonnelContactInfoTelService.Instance().HRPersonnelContactInfoTelMethod(Recivers); 
     foreach (var item in Recivers) 
     { 
      var res = App.Api.SMSMessageGroupService.Instance().AddOrUpdate(null, MessageId, item); 
     } 
     foreach (var z in q) 
     { 
      string SendNumber = Number[1].Trim().Substring(0, 3) == "+98" ? Number[1].Trim() : "+98" + Number[1].Trim(); 
      var res = App.Api.SMSMessageLogService.Instance().AddOrUpdate(null, MessageId, (int)z.Pers_Code, z.Tel.ToString(), 
       0, int.Parse(ddlSMSWorkingGroups.SelectedValue.ToString()), (int)z.Pers_Code, SendNumber, 0); 
      send.SendSMS("nazmaran", "qwerty", SendNumber, "09122596898", txtPredefinedRemarks.Text); 
     } 
+0

어떻게 사용합니까에 대한 코드를 추가하십시오 –

답변

0

나는 결과를 프로젝트에 익명 형식을 사용하는 LINQ 쿼리의 결과를 반환하는 동적 사용하지 않을 것입니다.

public class SomeName 
{ 
    public int Pers_Code { set; get; } 
    public string /* Change to Correct Type */ Tel { set; get;} 
} 

사용법 : 대신, 나는 결과를 보유하는 클래스 만들 것입니다 결과를 잡아 유형을 만들기

public List<SomeName> HRPersonnelContactInfoTelMethod(List<int> Recivers) 
{ 
    var HRPersonnelContactInfoTelService = App.Api.HRPersonnelContactInfoTelService.Instance().Data(); 
    var SMSGroupMemberService = App.Api.SMSGroupMemberService.Instance().Data(); 
    return (from x in SMSGroupMemberService 
      where Recivers.Contains(x.GroupID) 
      join v in HRPersonnelContactInfoTelService on x.Pers_Code equals v.Pers_Code 
      select new SomeName() { Pers_Code = (int)x.Pers_Code, Tel = v.Tel }).ToList(); 
} 

을 동적 사용의 복잡성에 비해 아무것도 아니다.

+0

작업 던지기 : 암시 적으로 'System.Collections.Generic'형식으로 변환 할 수 없습니다 'System.Collections.Generic.List << anonymous type : int Pers_Code, string Tel >>' .List ' – metro

+0

@metro 죄송합니다. 편집을 확인하십시오. – user3185569

+0

감사합니다. 그것은 효과가있다. – metro

0

.NET은 var 및 동적 반복을 통해 동적 유형 지정을 수행 할 수없는 것으로 보이며, 이는 객체 목록을 제공합니다.

var으로 변수를 만들 때 - .NET은 반환 유형을 예측할 수 없으며 모든 유형이 object에서 상속되므로 새로운 object 변수를 만듭니다.

그러나 반환 유형을 dynamic으로 구현하는 것은 나쁜 습관입니다.이 메서드를 호출하지 않으면 오류를 찾을 수 없습니다. 따라서 @ user3185569가 제안한대로 다른 클래스의 사용법을 구현하십시오.

관련 문제