2013-02-01 41 views
0

窺視,合併多個IQueryables在一起 - Silverlight的

我是個重生的處女Silverlight的,所以請大家多多包涵。我有兩個單獨的DomainServices,指向兩個不同的SQL數據庫服務器。在這些域服務中,我已經在每個域服務中設置了一些IQueryables。

我需要將兩個IQueryables從單獨的DomainServices合併在一起。我確定這一定是可以做到的。

以下是兩個域服務。

我想將GetCustomCallLogs(來自HEATLiveDomainService)和GetTblCallsLogged(來自HeatDomainService)合併在一起。 GetCustomCallLogs中的關鍵字是CallID,GetTblCallsLogged中的關鍵字是RecID。

如果有可能我明白我需要創建一個新類型來考慮來自兩個連接表中的任何字段。

希望我的情景解釋了我的情景,我不是愚蠢的。

在此先感謝

public class HEATLIVEDomainService : LinqToEntitiesDomainService<HeatIT9_LiveEntities> 
{ 

    // TODO: 
    // Consider constraining the results of your query method. If you need additional input you can 
    // add parameters to this method or create additional query methods with different names. 
    // To support paging you will need to add ordering to the 'Assignees' query. 
    public IQueryable<Assignee> GetAssignees() 
    { 
     return this.ObjectContext.Assignees; 
    } 

    // TODO: 
    // Consider constraining the results of your query method. If you need additional input you can 
    // add parameters to this method or create additional query methods with different names. 
    // To support paging you will need to add ordering to the 'CallLogs' query. 
    public IQueryable<CallLog> GetCallLogs() 
    { 
     //   return this.ObjectContext.CallLogs.Where(c => DateTime.Parse(c.ClosedDate).Year == 2012 && c.CallStatus == "Closed" && c.ClosedBy.Length > 0); 
     return this.ObjectContext.CallLogs.Where(c => c.CallStatus == "Closed" && c.ClosedDate.Substring(0, 4).Equals("2013")); 
    } 

    public IQueryable<CallLog> GetCallLogsLastThisYear() 
    { 
     return this.ObjectContext.CallLogs.Where(c => c.CallStatus == "Closed" && (c.ClosedDate.Substring(0, 4).Equals("2012") || c.ClosedDate.Substring(0, 4).Equals("2013"))); 
    } 

    public IQueryable<CustomCallLog> GetCustomCallLogs(string year) 
    { 
     var result = from i in this.ObjectContext.CallLogs 
     join p in this.ObjectContext.Assignees on i.ClosedBy equals p.LoginID 
     where i.CallStatus == "Closed" && i.ClosedDate.Substring(0, 4) == year 
     select new CustomCallLog 
     { 
      Score = 
      CallLog = i.CallID, 
      Name = p.Assignee1, 
      Yr = year, 
      Mth = i.ClosedDate.Substring(5, 2), 
      GroupName = p.GroupName 
     }; 
     return result; 
    } 


    public IQueryable<CustomClosedJobs> GetCustomClosedJobs() 
    { 
     var result = from i in this.ObjectContext.CallLogs 
        where i.CallStatus == "Closed" && i.ClosedDate.Substring(0, 4) =="2012" 
        group i by i.ClosedDate.Substring(5,2) into y 
        select new CustomClosedJobs 
        { 
         Type = "heat", 
         ClosedCalls = y.Count(), 
          Mth =y.Key 
        }; 
     return result; 
    } 


    // TODO: 
    // Consider constraining the results of your query method. If you need additional input you can 
    // add parameters to this method or create additional query methods with different names. 
    // To support paging you will need to add ordering to the 'Subsets' query. 
    public IQueryable<Subset> GetSubsets() 
    { 
     return this.ObjectContext.Subsets; 
    } 
} 

public class HEATDomainService : LinqToEntitiesDomainService<FEEDBACKPRDEntities1> 
{ 

    // TODO: 
    // Consider constraining the results of your query method. If you need additional input you can 
    // add parameters to this method or create additional query methods with different names. 
    // To support paging you will need to add ordering to the 'qryStoringLogs' query. 
    public IQueryable<qryStoringLog> GetQryStoringLogs() 
    { 
     return this.ObjectContext.qryStoringLogs.OrderBy(e => e.monthno); 
    } 

    public IQueryable<tblStoringLog> GetTop100Logs() 
    { 
     return this.ObjectContext.tblStoringLogs.OrderByDescending(e => e.responsetime).Take(100); 
    } 

    public IQueryable<tblStoringLog> GetLogCount(DateTime s, DateTime e) 
    { 
     return this.ObjectContext.tblStoringLogs.Where(x => x.responsetime >= s && x.responsetime <= e); 
    } 

    public IQueryable<qryStoringLog> GetLogs(int year, int mth) 
    { 
     return this.ObjectContext.qryStoringLogs.Where(e => e.Month.Equals(mth) && e.yr.Equals(year)); 
    } 

    public IQueryable<qryStoringLog> GetLogsForYear(int year) 
    { 
     return this.ObjectContext.qryStoringLogs.Where(e => e.yr.Equals(year)).OrderBy(e => e.monthno); 
    } 

    public DateTime GetFirstDate() 
    { 
     return (DateTime)this.ObjectContext.tblStoringLogs.OrderBy(e => e.responsetime).First().responsetime; 
    } 

    public DateTime GetLastDate() 
    { 
     return (DateTime)this.ObjectContext.tblStoringLogs.OrderByDescending(e => e.responsetime).First().responsetime; 
    } 

    public IQueryable<tblCallLogged> GetTblCallLoggeds() 
    { 
     return this.ObjectContext.tblCallLoggeds; 
    } 

    public IQueryable<tblStoringLog> GetTblStoringLogs() 
    { 
     return this.ObjectContext.tblStoringLogs; 
    } 

    [Query(IsComposable = false)] 
    public IQueryable<qryStoringLog> GetTblStoringLogsStatus(int statusid) 
    { 
     return this.ObjectContext.qryStoringLogs.Where(e => e.statusid == statusid); 
    } 


    public IQueryable<stResponsesLife_Result> LifeTimeResponses() 
    { 
     return this.ObjectContext.stResponsesLife().AsQueryable(); 
    } 


    public IEnumerable<CustomLifetime> GetCustomLifeTime() 
    { 
     var result = from i in this.ObjectContext.stResponsesLife().ToList() 
        select new CustomLifetime 
        { 
         Dates = i.Dates, 
         Vals = (int)i.Vals 
        }; 
     return result; 
    } 


    public int GetAllResponses() 
    { 
     return this.ObjectContext.qryStoringLogs.Count(); 
    } 

} 

注意事項: 不能有鏈接的服務器,這樣做時,在源(SQL Server)的是出了問題。 無法創建SP並使用OpenQuery(以及我可以但我想學會正確地做到這一點),因爲我確定這不是正確的做法。

回答

0

您可能需要第三種類型來包裝從每個服務返回的兩種不同類型,但這取決於您希望如何使用它。

ItemsControl不會在乎集合中的類型(Listbox,ComboBox等),但GridView類型控件可能會挑剔。

使用linq,這兩個列表可以簡單地合併。類似下面應該做的伎倆:

collection1.Select(o => (object)o).Concat(collection2.Select(o => (object)o)); 

的選擇和演員是讓合適的泛型集合是由查詢創建。

這可以進行調整,以將轉換結合到您的包裝類型中。即,而不是轉換爲Object,只需返回包裝類的新實例即可。

如果適用,您甚至可以使用聯盟。

全部放在一起:

collection1.Select(o => new MyWrapperType(o)) 
    .Union(collection2.Select(o => new MyWrapperType(o)));