RIA DomainService IQueryable - 选择

时间:2011-11-02 14:31:44

标签: c#-4.0 silverlight-4.0 ria iqueryable

在几个不同的教程之后,我一直在尝试针对我创建的数据库构建“Silverlight业务应用程序”。我发现我有两个问题。我在这里问的是如何过滤查询。

在使用VS2010模板时,在DomainService中构建的查询是:

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

我正在尝试针对相同的ObjectContext.tblChargeCodes创建另一个查询。拉整个表(30列~7k行)会产生超时错误。

我无法弄清楚如何选择。我想选择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 个答案:

答案 0 :(得分:1)

(抱歉我的英语不好)

您的代码问题是“选择” - 您的方法签名表明它必须返回一个IQ可用的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);

您还可以在查询中使用“包含”而不是“StartsWith”。