RIA DomainService IQueryable - Выбрать - PullRequest
0 голосов
/ 02 ноября 2011

Следуя нескольким разным учебникам, я пытался создать «бизнес-приложение Silverlight» на основе созданной мной базы данных. Я обнаружил, что у меня есть две проблемы. Здесь я спрашиваю, как отфильтровать запрос.

Запрос, встроенный в DomainService, при использовании шаблона VS2010:

[EnableClientAccess]
public class ChargesService : LinqToEntitiesDomainService<ChargesEntities>
{
    public IQueryable<tblChargeCode> GetCharges()
    {
        return ObjectContext.tblChargeCodes.OrderBy(e => e.Chrgs_Code_01).Take(10);
    }
}

Я пытаюсь создать другой запрос к тому же ObjectContext.tblChargeCodes. Извлечение всей таблицы (30 столбцов на ~ 7 тыс. Строк) приводит к ошибке времени ожидания.

Я не могу понять, как сделать выбор. Я хочу выбрать Charge_Codes_01 и Bill_Description с функциональностью типа «начинается с» (функция динамического поиска по выпадающему меню). Я пробовал разные варианты этого без успеха. Что-то просто не щелкает в моем мозгу.

    public IQueryable<tblChargeCode> SearchCharges(string num)
    {
        var min = System.Convert.ToInt32(num.PadRight(7, '0'));
        var max = System.Convert.ToInt32(num.PadRight(7, '9'));
        return ObjectContext.tblChargeCodes
            .Select(e => e.Chrgs_Code_01, e.Chrgs_Code_01_Desc)
            .Where(e => e.Chrgs_Code_01 >= min && e.Chrgs_Code_01 <= max)
            .OrderBy(e => e.Chrgs_Code_01)
            .Take(10);
    }

1 Ответ

1 голос
/ 03 ноября 2011

(извините за мой плохой английский)

Проблема с вашим кодом - «Выбрать» - ваша сигнатура метода говорит, что он должен возвращать IQueryable из tblChargeCode, поэтому вы не можете вернуть проекцию. Вот два способа написания запроса:

На сервере:

public IQueryable<tblChargeCode> SearchCharges(int min, int max, string description)
{        

    return ObjectContext.tblChargeCodes            
        .Where(e => e.Chrgs_Code_01 >= min && e.Chrgs_Code_01 <= max)
        .Where(e => e.Bill_Description.StartsWith(description))
        .OrderBy(e => e.Chrgs_Code_01)
        .Take(10);
}

И позвони на клиента:

context.Load(context.SearchChargesQuery(0, 9999999, "Bill"), (op) => 
{
    //op.Entities has your entities loaded
}, null);

Или вы можете просто оставить запрос на сервере:

public IQueryable<tblChargeCode> GetCharges()
{
    return ObjectContext.tblChargeCodes.OrderBy(e => e.Chrgs_Code_01);
}

И вызовите его с клиента (он отфильтрует на сервере )

context.Load(context.GetChargesQuery().Where(e => e.Chrgs_Code_01 >= 0 && e.Chrgs_Code_01 <= 9999999)
        .Where(e => e.Bill_Description.StartsWith("Bill"))
        .OrderBy(e => e.Chrgs_Code_01)
        .Take(10), (op) => 
        {
            //op.Entities has your entities loaded
        }, null);

Вы также можете использовать «Contains» вместо «StartsWith» в вашем запросе.

...