我想链接多个编译LINQ查询在一起。我成功地将两个查询链接在一起,但我无法获得三个正确的工作链。所以这里是减少我的代码重新创建问题。我的两个问题是:'为什么这不起作用?'和'是否有更好的方法来保持已编译查询的性能优势,并避免重复使用常用的基本查询逻辑?可以将多个已编译的linq查询链接在一起吗?
定义以下两个查询:
Func<DataContext, IQueryable<User>> selectUsers =
CompiledQuery.Compile(
(DataContext dc)=>dc.Users.Select(x=>x)
);
//
Func<DataContext, string, IQueryable<User>> filterUserName =
CompiledQuery.Compile(
(DataContext dc, string name) =>
selectUsers(dc).Where(user=>user.Name == name)
);
通话和枚举链正常工作:
filterUserName(new DataContext(), "Otter").ToList();
添加第三个查询链:
Func<DataContext, string, int, IQueryable<User>> filterUserAndGroup =
CompiledQuery.Compile(
(DataContext dc, string name, int groupId) =>
filterUserName(dc, name).Where(user=>user.GroupId == groupId)
);
调用链不起作用:
filterUserAndGroup(new DataContext(), "Otter", 101);
System.InvalidOperationException: 成员访问 '字符串名称' '用户' 上 类型不合法的“System.Linq.IQueryable
1[User].. at System.Data.Linq.SqlClient.SqlMember.set_Expression(SqlExpression value) at System.Data.Linq.SqlClient.SqlFactory.Member(SqlExpression expr, MemberInfo member) at System.Data.Linq.SqlClient.SqlBinder.Visitor.AccessMember(SqlMember m, SqlExpression expo) at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitMember(SqlMember m) at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr) at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitBinaryOperator(SqlBinary bo) at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr) at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect(SqlSelect select) at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitAlias(SqlAlias a) at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) at System.Data.Linq.SqlClient.SqlVisitor.VisitSource(SqlSource source) at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect(SqlSelect select) at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitIncludeScope(SqlIncludeScope scope) at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) at System.Data.Linq.SqlClient.SqlBinder.Bind(SqlNode node) at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(ResultShape resultShape, Type resultType, SqlNode node, ReadOnlyCollection
1个 parentParameters,SqlNodeAnnotations 注释)在 将System.Data.Linq .SqlClient.SqlProvider.BuildQuery(表达式 查询,SqlNodeAnnotations注解) 在 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Compile(表达式 查询)在 将System.Data.Linq .CompiledQuery.ExecuteQuery(DataContext 上下文在TestMethod的()中 ,对象[]参数)在 System.Data.Linq.CompiledQuery.Invoke(TArg0 为arg0,TArg1 ARG1)....
随时恢复它,但我可以忍受不得不滚动一行。 – 2009-10-09 14:24:40