LINQ'过滤器'代码出错导致错误

时间:2009-07-14 12:26:41

标签: linq .net-3.5 filter

我的服务项目中有以下代码,它试图根据标记获取帖子列表...就像我们在这里所提到的那样(没有将其作为meta.stackoverflow.com问题,并充分尊重....)

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

  

方法'布尔值   包含(System.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);
}

和Filter方法......

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;
}

有什么想法吗?我不知所措:(

2 个答案:

答案 0 :(得分:1)

尝试Any

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 == tag)
           select p;
}

更新(由PureKrome提供)

艾哈迈德的另一个建议(在下面的评论中)。这使用Contains方法,因此它将返回包含标记'Test'的所有帖子,例如。标记'睾丸'的帖子: -

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;
}

答案 1 :(得分:0)

在WithTag中,尝试将查询更改为使用List而不是IList:

return from p in query
       let taglist = p.TagList as List<string>
       where taglist.Contains(tag)
       select p;

同时查看此答案,类似于我的建议:Stack overflow in LINQ to SQL and the Contains keyword