在谓词表达式中传递where子句

时间:2013-02-17 22:11:32

标签: c# .net linq lambda

我有以下谓词表达式。

public IQueryable<T> Find(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
    {
        return //boolean
    }

这是我调用方法的地方:

    public void TestMethod1()
    {
        author.AuthorName = authorName;

        using (var context = new AspBlogRepository<Author>())
        {
            if (context.Find(e => e.AuthorName == authorName))
            {
                //do nothing
            }
            context.Add(author);   
        }
    }

我收到一条错误消息,说我无法将IQueryable转换为bool。我只是希望能够使用我的谓词表达式来查看作者是否已经在数据库中。

非常感谢任何帮助。

谢谢!

3 个答案:

答案 0 :(得分:1)

错误说明了一切。 context.Find(e => e.AuthorName == authorName)正在返回IQueryable<T>If期待bool

所以你对if (context.Find(e => e.AuthorName == authorName))的使用是错误的。将其更改为

if (context.Find(e => e.AuthorName == authorName).Any())
{

}

答案 1 :(得分:1)

context.Find会返回IQueryable<T>。您的代码可能看起来像:

if (context.Find(e => e.AuthorName == authorName).Count() == 1)
{
    //do nothing
}

答案 2 :(得分:1)

public IQueryable<T> Find(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
    {
        return //boolean
    }

问题出在这里,如果你确实返回了布尔值。如果此方法位于您的上下文中,您首先需要解析Author,然后过滤存储库中的Authors

如果这是一个EF上下文,并且您可以访问存储库中的EF上下文,那么您应该能够像这样设置数据库:

var entitySet = context.Set<T>();

然后,您可以针对entitySet运行谓词,返回已过滤的结果。