2011-03-08 2 views
2

linq to sql (C#)을 사용하여 관련없는 두 테이블의 결합 된 결과를 표시하는 가장 좋은 방법을 찾기 위해 고심하고 있습니다. 테이블은 EmailAlerts 및 TextAlerts이며 각각 UserName, Type 및 Status (다른 열은 다르지만이 쿼리에는이 세 가지만 필요함)가 있습니다. 보고 목적으로 시스템에 활성 경고가있는 사용자의 스냅 샷을 가져와야합니다.관련없는 테이블 (linq에서 sql)에서 결합 된 결과 표시

예 테이블 : 예제 테이블이 CSV 파일에 넣어됩니다

EmailAlerts 
UserName Type Status 
Alice  1 0 
Alice  1 0 
Alice  1 1 
Alice  2 0 
Alice  2 1 
Alice  2 1 
Bob   1 1 
Bob   2 1 
Mallory  1 1 
Mallory  2 1 

TextAlerts 
UserName Type Status 
Alice  1 1 
Alice  2 0 
Alice  2 1 
Bob   1 0 
Mallory  1 1 
Mallory  2 1 

, 최종 결과는 다음과 같아야합니다 : 그래서

Username, ActiveType1Email, ActiveType2Email, ActiveType1Text, ActiveType2Text 
Alice, Yes, Yes, No, Yes 
Bob, No, No, Yes, No 

, 각각의 고유 한 사용자에 대해, 두 유형 중 하나의 활성 (상태 = 0) 전자 메일 또는 텍스트 경고가 있는지 확인하십시오. 두 유형 모두에 대해 여러 개의 경고를 가질 수 있습니다. 사용자는 Sitecore에 저장되므로 사용자 테이블은 없습니다.

지금은 모든 고유 사용자 이름을 먼저 얻은 다음 각 사용자 이름을 통해 반복적으로 알리미를 확인합니다. 그것은 효과가 있지만 꽤 끔찍해서 더 나은 해결책을 찾고 싶습니다. 하나의 쿼리로 모든 것을 수행 할 수 있습니까? 저장 프로 시저가 더 좋은 방법일까요? 누구든지 올바른 방향으로 나를 가리킬 수 있다면 코드를 직접 이해할 수 있습니다. 가장 좋은 방법을 생각해 볼 수는 없습니다.

UPDATE : 그것은 당신에게 아이디어를 줄 수있는 어떤 경우

public static List<Dictionary<string, string>> GetUserAlertsForCSV() 
{ 
    List<Dictionary<string, string>> alerts = new List<Dictionary<string, string>>(); 

    var usernames = ((from e in db.EmailAlerts select e.UserName).Union 
        (from t in db.TextAlerts select t.UserName)).Distinct(); 

    foreach (var username in usernames) 
    { 
     Dictionary<string, string> d = new Dictionary<string, string>(); 
     d.Add("username", username); 
     bool hasActiveAlert = false; 

     var activeType1Email = (from e in db.EmailAlerts 
        join a in db.AlertStatusCodes on e.Status equals a.StatusCode 
        where e.UserName == username 
        && e.Type == (int)AlertType.Type1 
        && a.Description == "active" 
        select e).FirstOrDefault(); 

     if (activeType1Email != null) 
     { 
      d.Add("type1email", "Yes"); 
      hasActiveAlert = true; 
     } 
     else 
     { 
      d.Add("type1email", "No"); 
     } 

     // repeat the above for activeType1Text, activeType2Email and activeType2Text 

     if (hasActiveAlert) 
     { 
      alerts.Add(d); 
     } 
    } 

    return alerts; 
} 

감사합니다,

Annelie

+0

달성하고자하는 코드를 보여 주시겠습니까? 힌트를 줄 수 있습니까? 이 방법은 목표가 명확하지 않습니다. – TheBoyan

+0

@bojanskr - 예제 테이블을 추가하고, 지금까지 가지고있는 SQL 코드에 linq를 추가했지만 경고를받습니다. :) – annelie

+0

아무런 문제가 없다. 단지 비판하지 않고 돕고 싶다. – TheBoyan

답변

2

이 밖으로 시도, 다음은 현재 (추한) 코드입니다. 그 뒤에 내 생각은 상호 연관된 하위 쿼리를 사용하여 필요한 모든 정보를 저장하는 새로운 익명 형식을 사용하는 것입니다. 체크 아웃 :

var usernames = ((from e in db.EmailAlerts select e.UserName).Union 
       (from t in db.TextAlerts select t.UserName)).Distinct(); 
var result = 
    from u in usernames 
    select new 
    { 
     Username = u.Username, 
     ActiveType1Email = (from e in db.EmailAlerts 
          where e.UserName == u 
          && e.Type == (int)AlertType.Type1 
          && a.Description == "active" 
          select e).FirstOrDefault(); 
     /* 
     ... and so on repeat for activeType1Text, activeType2Email and activeType2Text 

     */ 
    } 

    // and then go trough the result set which is IEnumarable<T> and use it for what you need 
    foreach(var a in result) 
    { 
     var something = a.ActiveType1Email; 
     /* etc. */ 
    } 

이 정보는 도움이됩니까?

+0

아래에서 확인해 보았습니다. 죄송합니다. 명확하지 않았으며 예제 테이블로 내 질문을 업데이트 할 것입니다. 사용자는 두 테이블 모두에 레코드를 가질 필요는 없습니다. – annelie

+1

이것은 더 멋지게 보입니다. 나는 하나 또는 두 개의 큰 쿼리로 만들려고 노력했지만이 방법을 사용하는 것이 가장 좋은 방법 일 수 있습니다. 도와 주셔서 감사합니다! – annelie

관련 문제