【发布时间】:2011-05-13 09:37:29
【问题描述】:
我知道 IQueryable 不会产生任何结果,而只是一个表达式生成器,我的问题是如何实际使用它来执行查询并将集合作为 List 返回以便能够将其绑定到网格上。
IQueryable query = _campaignManager.GetCampaign(filter, values);
// this line returns error
List<Campaign> campaigns = query.Cast<Campaign>().ToList();
grdCampaigns.DataSource = campaigns;
grdCampaigns.DataBind();
更多细节:GetCampaign()
public IQueryable GetCampaign(string filter, params object[] values)
{
string parameters = string.Empty;
foreach (object obj in values)
{
parameters += obj.ToString() + ",";
}
parameters.Remove(parameters.Count() - 1, 1);
var query = context.Campaigns.Where(filter, parameters)
.Select("new(CampaignID,CampaignName)");
return query;
}
我正在使用 DynamicQueryable 进行动态 linq 查询
DynamicQueryable 的 .Select 扩展方法
public static IQueryable Select(this IQueryable source, string selector, params object[] values)
{
if (source == null) throw new ArgumentNullException("source");
if (selector == null) throw new ArgumentNullException("selector");
LambdaExpression lambda = DynamicExpression.ParseLambda(source.ElementType, null, selector, values);
return source.Provider.CreateQuery(
Expression.Call(
typeof(Queryable), "Select",
new Type[] { source.ElementType, lambda.Body.Type },
source.Expression, Expression.Quote(lambda)));
}
IQueryable .Where() 扩展
public static IQueryable Where(this IQueryable source, string predicate, params object[] values)
{
if (source == null) throw new ArgumentNullException("source");
if (predicate == null) throw new ArgumentNullException("predicate");
LambdaExpression lambda = DynamicExpression.ParseLambda(source.ElementType, typeof(bool), predicate, values);
return source.Provider.CreateQuery(
Expression.Call(
typeof(Queryable), "Where",
new Type[] { source.ElementType },
source.Expression, Expression.Quote(lambda)));
}
谢谢...
【问题讨论】:
-
我使用实体框架 4,错误:无法将类型“DynamicClass1”转换为类型“Campaign”。 LINQ to Entities 仅支持转换实体数据模型原语类型。
-
注意:'Campaign' 是 EF 上下文的生成实体
-
你应该让我们看看
GetCampaign()。无法成像DynamicClass1的来源。肯定这个演员是无效的。 -
我认为新的 Type[] 返回的是 DynamicClass1 类型...我不确定
-
@dotnetlinc 你有没有解决过这个问题我也有类似的问题,我只需要转换到任何 iEnumberable
标签: c# linq iqueryable