C# EpiServer DynamicDataStore LINQ语句中的sql语法不正确
我正在编写一个查询,以从epserver中的C# EpiServer DynamicDataStore LINQ语句中的sql语法不正确,c#,linq,episerver,C#,Linq,Episerver,我正在编写一个查询,以从epserver中的DynamicDataStore中检索一些数据。运行代码时,出现以下错误: System.Data.SqlClient.SqlException:靠近'>'的语法不正确 以下是相关查询: BlogContentStore store = new BlogContentStore(); IQueryable<UwlBlogPost> posts = store.Posts.Where(p => Blog == p.BlogId &
DynamicDataStore
中检索一些数据。运行代码时,出现以下错误:
System.Data.SqlClient.SqlException:靠近'>'的语法不正确
以下是相关查询:
BlogContentStore store = new BlogContentStore();
IQueryable<UwlBlogPost> posts = store.Posts.Where(p => Blog == p.BlogId && p.ReadyToPost && p.PostOn <= DateTime.Now);
if (taggedPeople.Count() > 0 || taggedDepartments.Count() > 0 || taggedDepartments.Count() > 0)
{
posts = posts.Where(p => p.PeopleTags.Intersect(taggedPeople).Count() > 0
|| p.DepartmentTags.Intersect(taggedDepartments).Count() > 0
|| p.KeywordTags.Intersect(taggedKeywords).Count() > 0);
}
posts = posts.OrderByDescending(p => p.PostOn).Take(DisplayCount);
BlogContentStore=新建BlogContentStore();
IQueryable posts=store.posts.Where(p=>Blog==p.BlogId&&p.ReadyToPost&&p.PostOn 0 | | | taggedDepartments.Count()>0 | | | taggedDepartments.Count()>0)
{
posts=posts.Where(p=>p.PeopleTags.Intersect(taggedPeople).Count()>0
||p.DepartmentTags.Intersect(taggedDepartments).Count()>0
||p.KeywordTags.Intersect(taggedKeywords.Count()>0);
}
posts=posts.OrderByDescending(p=>p.PostOn).Take(DisplayCount);
我觉得所有东西的语法都很好,编译起来也很好。我设法解决了这个问题。查看SQL server日志,我可以看到,
Intersect
语句没有转换为SQL,因此我决定动态创建查询表达式来绕过它:
if (taggedPeople.Count > 0 || taggedDepartments.Count > 0 || taggedKeywords.Count > 0)
{
ParameterExpression paramExpr = Expression.Parameter(typeof(UwlBlogPost), "p");
Expression peopleTagsExpr = Expression.Property(paramExpr, "PeopleTags");
Expression deptTagsExpr = Expression.Property(paramExpr, "DepartmentTags");
Expression keywordTagsExpr = Expression.Property(paramExpr, "KeywordTags");
Expression filterExpr = null;
if(taggedPeople.Count > 0)
{
filterExpr = FilterLambda<string>(taggedPeople, peopleTagsExpr, paramExpr);
}
if(taggedDepartments.Count > 0)
{
Expression filter = FilterLambda<int>(taggedDepartments, deptTagsExpr, paramExpr);
filterExpr = (filterExpr == null) ? filter : MatchAll ? Expression.And(filterExpr, filter) : Expression.Or(filterExpr, filter);
}
if(taggedKeywords.Count > 0)
{
Expression filter = FilterLambda<int>(taggedKeywords, keywordTagsExpr, paramExpr);
filterExpr = (filterExpr == null) ? filter : MatchAll ? Expression.And(filterExpr, filter) : Expression.Or(filterExpr, filter);
}
posts = posts.Where(Expression.Lambda<Func<UwlBlogPost, bool>>(filterExpr, new[] { paramExpr }));
}
private Expression FilterLambda<T>(List<T> tags, Expression field, ParameterExpression paramExpr)
{
Expression firstTag = Expression.Constant(tags.First());
Expression root = Expression.Call(field, tags.GetType().GetMethod("Contains"), firstTag);
if (tags.Count > 1)
{
foreach (T tag in tags.Skip(1))
{
Expression singleTag = Expression.Constant(tag);
Expression cond = Expression.Call(field, tags.GetType().GetMethod("Contains"), singleTag);
root = MatchAll ? Expression.And(root, cond) : Expression.Or(root, cond);
}
}
return root;
}
if(taggedPeople.Count>0 | | | taggedDepartments.Count>0 | | taggedKeywords.Count>0)
{
ParameterExpression parameterxpr=Expression.Parameter(typeof(UwlBlogPost),“p”);
Expression peopleTagsExpr=Expression.Property(参数xpr,“PeopleTags”);
Expression depttagexpr=Expression.Property(参数xpr,“DepartmentTags”);
Expression keywordTagsExpr=Expression.Property(paramExpr,“KeywordTags”);
表达式filterExpr=null;
如果(taggedPeople.Count>0)
{
filterExpr=FilterLambda(taggedPeople、peopleTagsExpr、ParameterExpr);
}
如果(taggedDepartments.Count>0)
{
表达式filter=FilterLambda(taggedDepartments、depttagexpr、paramExpr);
filterExpr=(filterExpr==null)?filter:MatchAll?表达式。和(filterExpr,filter):表达式。或(filterExpr,filter);
}
如果(taggedKeywords.Count>0)
{
表达式filter=FilterLambda(taggedKeywords、关键字tagsexpr、参数xpr);
filterExpr=(filterExpr==null)?filter:MatchAll?表达式。和(filterExpr,filter):表达式。或(filterExpr,filter);
}
posts=posts.Where(Expression.Lambda(filterExpr,new[]{paramExpr}));
}
私有表达式过滤器lambda(列表标记、表达式字段、参数表达式参数xpr)
{
Expression firstTag=Expression.Constant(tags.First());
Expression root=Expression.Call(字段,tags.GetType().GetMethod(“包含”),firstTag);
如果(tags.Count>1)
{
foreach(标记中的T标记。跳过(1))
{
表达式singleTag=表达式常数(tag);
Expression cond=Expression.Call(字段,tags.GetType().GetMethod(“包含”),singleTag);
root=MatchAll?表达式和(root,cond):表达式或(root,cond);
}
}
返回根;
}
对于与“查找”相关的答案表示抱歉(现在将其删除)。不知何故,我认为问题是关于查找而不是DDS。smh