LINQ“筛选器”代码引发错误时出现问题
我的服务项目中有以下代码,它试图根据标签获取帖子列表。。。就像我们在这里讨论的那样,恕我直言,不要把这变成一个meta.stackoverflow.com问题 此服务代码创建一个linq查询,将其传递到存储库,然后返回结果。没什么太复杂的。我的LINQ筛选器方法失败,出现以下错误:- 方法布尔 ContainsSystem.String“”没有 支持转换为SQL 我不确定应该如何更改我的linq过滤器方法:下面是代码LINQ“筛选器”代码引发错误时出现问题,linq,.net-3.5,filter,Linq,.net 3.5,Filter,我的服务项目中有以下代码,它试图根据标签获取帖子列表。。。就像我们在这里讨论的那样,恕我直言,不要把这变成一个meta.stackoverflow.com问题 此服务代码创建一个linq查询,将其传递到存储库,然后返回结果。没什么太复杂的。我的LINQ筛选器方法失败,出现以下错误:- 方法布尔 ContainsSystem.String“”没有 支持转换为SQL 我不确定应该如何更改我的linq过滤器方法:下面是代码 public IPagedList<Post> GetPosts(
public IPagedList<Post> GetPosts(string tag, int index, int pageSize)
{
var query = _postRepository.GetPosts()
.WithMostRecent();
if (!string.IsNullOrEmpty(tag))
{
query = from q in query
.WithTag(tag) // <--- HERE'S THE FILTER
select q;
}
return query.ToPagedListOrNull(index, pageSize);
}
而过滤方法
public static IQueryable<Post> WithTag(this IQueryable<Post> query,
string tag)
{
// 'TagList' (property) is an IList<string>
return from p in query
where p.TagList.Contains(tag)
select p;
}
有什么想法吗?我不知所措:试试:
PureKrome更新
艾哈迈德在下面的评论中提出了另一项建议。它使用Contains方法,因此它将返回包含标记“Test”的所有帖子,例如带有标记“Testicle”的帖子:-
public static IQueryable<Post> WithTag(this IQueryable<Post> query,
string tag)
{
// 'TagList' (property) is an IList<string>
return from p in query
where p.TagList.Any(t => t.Contains(tag))
select p;
}
尝试:
PureKrome更新
艾哈迈德在下面的评论中提出了另一项建议。它使用Contains方法,因此它将返回包含标记“Test”的所有帖子,例如带有标记“Testicle”的帖子:-
public static IQueryable<Post> WithTag(this IQueryable<Post> query,
string tag)
{
// 'TagList' (property) is an IList<string>
return from p in query
where p.TagList.Any(t => t.Contains(tag))
select p;
}
在WithTag中,尝试将查询更改为使用列表而不是IList:
return from p in query
let taglist = p.TagList as List<string>
where taglist.Contains(tag)
select p;
还可以查看这个答案,它与我的建议类似:在WithTag中尝试将查询更改为使用列表而不是IList:
return from p in query
let taglist = p.TagList as List<string>
where taglist.Contains(tag)
select p;
也可以看看这个答案,它与我的建议类似:Genius!!!能否请您详细说明ANY和a CONTAINS在理论上的区别?它们在理论上是一样的,只是语法不同吗?显然,linq到SQL的实现对于这两种方法都是不同的……这是因为您使用的Contains方法是ILST的成员,而不是像任何其他方法一样的特殊linq扩展方法。因此,当查询转换为SQL时,它没有关联的转换。如果您已经在内存中按照@Ahmad maged建议的列表执行结果,则可以使用Contains。当然,在SQL中进行过滤更好。有趣的是,ANY和List+Contains都进行了精确的字符串匹配。因此,如果我搜索标签'Test',它只返回至少包含一个标签的所有帖子,而这个标签恰好是'Test'。如果一个标记有“Testicles”,那么它不会返回。@Pure.Krome:如果你想让它工作,你可以修改bruno的代码,并在t:Anyt=>t.ContainstagGenius上使用string contains方法!!!能否请您详细说明ANY和a CONTAINS在理论上的区别?它们在理论上是一样的,只是语法不同吗?显然,linq到SQL的实现对于这两种方法都是不同的……这是因为您使用的Contains方法是ILST的成员,而不是像任何其他方法一样的特殊linq扩展方法。因此,当查询转换为SQL时,它没有关联的转换。如果您已经在内存中按照@Ahmad maged建议的列表执行结果,则可以使用Contains。当然,在SQL中进行过滤更好。有趣的是,ANY和List+Contains都进行了精确的字符串匹配。因此,如果我搜索标签'Test',它只返回至少包含一个标签的所有帖子,而这个标签恰好是'Test'。如果标记有“Testicles”,则不会返回。@Pure.Krome:如果您希望这样做,您可以修改bruno的代码并在t:Anyt=>t.containstage上使用string contains方法来完成,也可以使用与上述代码相同的Any方法来实现部分匹配(如果需要):taglist.Anyt=>t.containstage如果需要,还可以使用与上述代码相同的Any方法来实现部分匹配:taglist.Anyt=>t.Containstag