【问题标题】:RIA DomainService IQueryable - SelectRIA DomainService IQueryable - 选择
【发布时间】:2011-11-02 14:31:43
【问题描述】:

按照几个不同的教程,我一直在尝试针对我创建的数据库构建“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 创建另一个查询。拉取整个表(约 7k 行 30 列)会产生超时错误。

我不知道如何进行选择。我想选择 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);
    }

【问题讨论】:

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


    【解决方案1】:

    (对不起我的英语不好)

    你的代码的问题是“选择”——你的方法签名说它必须返回一个 tblChargeCode 的 IQueryable,所以你不能返回一个投影。您可以通过以下两种方式编写查询:

    在服务器中:

    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”。

    【讨论】: