我想鏈接多個編譯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