【发布时间】:2009-10-09 14:07:41
【问题描述】:
我正在尝试将多个已编译的 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, ReadOnlyCollection1 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 上下文,对象 [] 参数)在 System.Data.Linq.CompiledQuery.Invoke(TArg0 arg0, TArg1 arg1) 在 TestMethod() 中 ....
【问题讨论】:
-
可以随意恢复它,但我可以忍受不得不滚动一行。
标签: linq linq-to-sql