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(

我的服务项目中有以下代码,它试图根据标签获取帖子列表。。。就像我们在这里讨论的那样,恕我直言,不要把这变成一个meta.stackoverflow.com问题

此服务代码创建一个linq查询,将其传递到存储库,然后返回结果。没什么太复杂的。我的LINQ筛选器方法失败,出现以下错误:-

方法布尔 ContainsSystem.String“”没有 支持转换为SQL

我不确定应该如何更改我的linq过滤器方法:下面是代码

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