Silverlight, использующий Entity для LINQ в соединениях - PullRequest
1 голос
/ 19 июня 2011

У меня есть следующий код, который работает и получает данные для одного объекта.

LoadOperation<TimeForm> loadoperation = _cc.Load(_cc.GetTimeFormsQuery()
           .Where(o => o.Start>= weekrange.startdate 
                    && o.End<= weekrange.enddate 
                    && o.USERID== "TEST"));

Однако у меня есть 3 таблицы, которые подключаются к этой таблице TimeForm, в sql мой запрос выглядит следующим образом:

SELECT T* FROM TimeForm 
INNER JOIN CLIENT ON TimeForm.CODEID= CLIENT.CODEID 
INNER JOIN RATE ON TimeForm.RATEID= RATE.RATEID 
INNER JOIN TASK ON TimeForm.TASKID = TASK.TASKID  

Как это может быть возможно с вышеуказанным синтаксисом?Мне нужны некоторые значения из этих таблиц.

Ответы [ 2 ]

0 голосов
/ 20 июня 2011

Вам необходимо перейти к файлу доменных служб (где определено GetTimeFormsQuery ()). Это будет выглядеть примерно так:

public IQueryable<TimeForm> GetTimeForms() {
    return this.Context.TimeForm;
}

, и добавьте к нему, чтобы это было так:

public IQueryable<TimeForm> GetTimeForms() {
    return this.Context.TimeForm
        .Include("Client") // Assuming your property to see the client is called "Client"
        .Include("Rate") // Same for "Rate"
        .Include("Task"); // and "Task
}

Или как называются свойства навигации в вашей сущности TimeFrom.

Silverlight не выполняет отложенную загрузку, поэтому вам придется явно включить эти свойства в запрос службы домена. Также, вероятно, целесообразно создать дополнительный метод в доменной службе, который принимает дату начала и окончания и идентификатор пользователя, чтобы вы не перетаскивали всю таблицу по проводам каждый раз.

public IQueryable<TimeForm> GetTimeFormsWithStartAndEnd(DateTime start, DateTime end, string userId) {
    return this.Context.TimeForm
        .Include("Client") // Assuming your property to see the client is called "Client"
        .Include("Rate") // Same for "Rate"
        .Include("Task") // and "Task
        .Where(o => o.Start>= start 
                && o.End<= end 
                && o.USERID== userId));

}

После того, как вы перестроите свой веб-проект, у вас в Silverlight будет метод GetTimeFormsWithStartAndEndQuery с этими тремя параметрами.

Гудлак!

0 голосов
/ 20 июня 2011

Попробуйте что-то вроде этого:

var query = context.TimeForm.
            Join(context.CLIENT,
            t => t.CODEID, c => c.CODEID ,
            (t, c) => new
            {
                PropertyA = t.ColumnA,
                PropertyB = c.ColumnB                    
            }).Join(context.RATE,
                    b => b.RATEID, r => r.RATEID,
                    (b, r) => new
                    {
                        PropertyC = b.ColumnC,
                        PropertyD = r.ColumnD                            
                    }).Join(context.TASK,
                           x => x.TASKID, t => t.TASKID,
                           (x,t) => new
                           {
                               PropertyE = x.ColumnE,
                               PropertyF = t.ColumnF
                           });

PropertyA, B и т. Д. - это просто свойства, представленные в типе, который используется для хранения данных, возвращаемых из запроса. Принимая во внимание, что столбцы A, B и т. Д. Являются столбцами, присутствующими в таблицах, участвующих в объединении. Вы можете заменить их фактическими значениями в своем запросе.

...