Объединение нескольких IQueryables вместе - Silverlight

Peeps,

Я рожденный свыше девственницей 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 (ну, я мог бы, но я хочу научиться делать это правильно), так как я уверен, что это не правильный способ сделать это.

1 ответ

Вам может понадобиться третий тип, чтобы обернуть два разных типа, возвращаемых из каждого сервиса, но это зависит от того, как вы хотите его использовать.

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)));
Другие вопросы по тегам