2009-03-10 5 views
1

나는이 코드 단편을 가지고있다.이 LINQ 조각을 코딩하는 더 좋은 방법이 있습니까?

SmsDataClassesDataContext dc = new SmsDataClassesDataContext(); 

     // Get the customer 
     Customer currentCustomer = dc.Customers.Single(c => c.Hash1 == forThisHash); 


     // Get from Name (LINQ to XML) 
     var q = from c in thisSmsPack.Descendants("from") 
       select c; 

     string from = q.First().Value; 

     foreach (XElement element in thisSmsPack.Descendants("to")) 
     { 
      // Create the queue 
      SmsQueue sq = new SmsQueue(); 
      sq.CustomerId = currentCustomer.CustomerId; 
      sq.MsgFrom = from; 

      sq.MsgTo = element.Attribute("name").Value; 
      sq.MsgPhone = element.Attribute("phone").Value; 
      sq.MsgBody = element.Attribute("msg").Value; 
      sq.Priority = currentCustomer.SendsSmsAtPriority; 
      sq.DontSendUntil = GetNextSendDate(); 

      // sq.TimeCreated = System.DateTime.Now; 

      currentCustomer.SmsQueues.Add(sq); 
     } 
     dc.SubmitChanges(); 

"SmsQueues"라는 새로운 인스턴스를 생성하고 값을 채우는 중이며 foreach 루프가 끝나면 변경 사항을 제출한다. .NET 3.5가 가지고있는 새로운 lambda/linq/anonymous 유형을 감안할 때, 위의 목적을 달성하기위한 "현대적인"방법이 있습니까?

부차적 인 질문으로, 아마도 관련, linq 식의 선택 부분에 다른 열로 구성된 기존 형식을 반환 할 수 있습니까?

T1 == T1.Id, T1.Name

T2 == T2.Id, T2.Phone

T3 == T3.Name, T3 .Phone, T3.SomethingElse

다음을 반환하는 LINQ 쿼리를 수행 할 수 있습니까?

T1.Name, T2.Phone, SomethingElseNew

그리고 .NET에 유형 T3임을 알리십시오. 그것의 새로운 인스턴스)? 그런 식으로 SubmitChanges를 할 때 새로운 T3 인스턴스가 DB에 삽입됩니까?

내가 나 자신을 분명히하는지 나는 모른다 : S

답변

3

내가 이것을 테스트하기 위해 사용할 수있는 시스템을 필요는 없습니다 S,하지만 난이 (또는 아주 가까운 무언가가) 작동한다고 생각합니다.

CustomerId = currentCustomer.CustomerId; 
var sqrange = from element in thisSmsPack.Descendants("to")) 
       select new SmsQueue 
       { 
      // Create the queue 
       MsgFrom = from, 
       MsgTo = element.Attribute("name").Value, 
       MsgPhone = element.Attribute("phone").Value, 
       MsgBody = element.Attribute("msg").Value, 
       Priority = currentCustomer.SendsSmsAtPriority, 
       DontSendUntil = GetNextSendDate() 
      // TimeCreated = System.DateTime.Now 
      }; 
    currentCustomer.SmsQueues.AddRange(sqrange); 

편집 : 고정 수많은 구문 오류 (코멘트에서 묘사로)

+0

당신을 아마도 Add() 대신 AddRange()를 사용해야 할 것입니다. – tvanfosson

+0

새로운 새로운 SmsQueue 선택은 오타입니까? 당신은 의미 : 새로운 SmsQueue 선택? 각 항목 뒤에 오는 세미콜론은 쉼표 여야합니다. "sq"가 없기 때문에 currentCustomer.SmsQueues.Add (또는 AddRange)를 사용할 수 없습니다. 거기에 무엇을 추가해야합니까? :( –

+0

찾았습니다. 사용하려면 : currentCustomer.SmsQueues.Add (sqrange); (그것은 분명하지만 여전히 ...);) Add 대신 AddRange를 사용하고 ";" 각 진술 후 쉼표 용. 또한 선택 항목에 두 번 "새로운"것이 있습니다. 그러나 효과가있었습니다. 감사!!! –

0

당신은 (해제 될 수 있습니다 약간 여기에는 인텔리 구문) 같은 것을 할 수 없었다 :

var q = T1.Join(T2, t => t.Id, t2 => t2.Id) 
    select new T3{Name=t.Name,Phone=t2.Phone,SomethingElseNew="Chickens"}; 
+0

고마워, 그게 내가 세미콜론 대신 쉼표가 필요하다는 것을 알게 해 주었다. T4와 T3에이 T4 (T3.t4id)에 대한 FK가있는 경우 T4.T3s.Add()를 수행 할 수 있습니까? 새로 만든 T3를 어떻게 참조 할 수 있습니까? 큐.? –

+0

FK가 DB 측에서 올바르게 설정되면 LINQ는 조인을하지 않고도 LINQ를 처리하고 설명 된대로 관련 개체의 메서드를 호출 할 수 있습니다. q는 IEnumerable 이므로 다른 컬렉션 (foreach 루프, .first() 등 호출)과 마찬가지로 액세스 할 수 있습니다. –

관련 문제