在几个不同的教程之后,我一直在尝试针对我创建的数据库构建“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);
}
答案 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”。