Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将二进制表达式转换为表达式<;Func<;T、 布尔>>;?_C#_Entity Framework_Linq_Lambda_Expression - Fatal编程技术网

C# 如何将二进制表达式转换为表达式<;Func<;T、 布尔>>;?

C# 如何将二进制表达式转换为表达式<;Func<;T、 布尔>>;?,c#,entity-framework,linq,lambda,expression,C#,Entity Framework,Linq,Lambda,Expression,我有以下简单的扩展类 public static class ExpressionOrExtension { public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> source, Expression<Func<T, bool>> expression) { if (source =

我有以下简单的扩展类

public static class ExpressionOrExtension
{
    public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> source, Expression<Func<T, bool>> expression)
    {
        if (source == null)
            return expression;
        return Expression.Or(source, expression);
    }
}

您需要构造lambda表达式:

var p = Expression.Parameter(typeof(T));
return (Expression<Func<T,bool>>)Expression.Lambda(
    Expression.Or(
        Expression.Invoke(source, p)
    ,   Expression.Invoke(expression, p)
    )
,   p
);
var p=Expression.Parameter(typeof(T));
return(Expression)Expression.Lambda(
表达。或(
Expression.Invoke(source,p)
,Expression.Invoke(表达式,p)
)
P
);

表达式a=x=>x>5;
表达式b=x=>x<-5;
var或=或(a,b);
var f=(Func)或.Compile();
对于(inti=-10;i我使用了nuget包并像这样实现了它

    public IQueryable<BookVerse> FindByVerseReferences(string bookCode, params VerseReference[] verseReferences)
    {
        var predicateBuilder = PredicateBuilder.New<BookVerse>();
        Expression<Func<BookVerse, bool>> predicate = null;
        foreach(VerseReference verseReference in verseReferences ?? new VerseReference[0])
        {
            Expression<Func<BookVerse, bool>> conditions = (x =>
                    x.BookCode == bookCode
                    && x.Chapter == verseReference.Chapter
                    && x.FirstVerse <= verseReference.LastVerse
                    && x.LastVerse >= verseReference.FirstVerse);
            predicate = predicateBuilder.Or(conditions);
        }
        return ObjectSpace.BookVerses.AsExpandable().Where(predicate);
    }
public IQueryable FindByVerserReferences(字符串bookCode,参数vs参考[]vs参考)
{
var predicateBuilder=predicateBuilder.New();
表达式谓词=null;
foreach(VerserReference VerserReference中的VerserReference??新建VerserReference[0])
{
表达式条件=(x=>
x、 BookCode==BookCode
&&x.章节==与参考章节相对
&&x.FirstVerse=verseReference.FirstVerse);
谓词=谓词生成器或(条件);
}
返回ObjectSpace.BookVerses.AsExpandable().Where(谓词);
}

这取决于OP使用表达式的目的,这可能有效,也可能无效。我知道EF不支持这一点,其他LINQ提供程序可能也有问题。是的,它是实体框架。我添加了一个用例源代码片段以供澄清。我认为
表达式.Invoke
不必要,但实际上它们不是。如果您使用LINQKit,整个问题没有任何意义,因为问题中的功能是由LINQKit提供的。这就是为什么答案中提到了LINQKit,而不是在问题中,因为我曾经解决过这个问题:)不,你没有。问题是关于你的
扩展方法,而你的“答案”与这个问题没有任何共同之处。我的意思是,所讨论的
方法仍然不起作用:)我们必须同意disagree@IvanStoev现在可以通过调用LINQKit的
predicateBuilder.Or
来实现所讨论的
方法。因为它现在只不过是一个包装器,所以这个答案中的包装器已经被删除了,但是这个答案中的代码确实显示了它是如何完成的。
Expression<Func<int,bool>> a = x=>x > 5;
Expression<Func<int,bool>> b = x=>x < -5;
var or = Or(a, b);
var f = (Func<int,bool>)or.Compile();
for (int i = -10 ; i <= 10 ; i++) {
    Console.WriteLine("{0} - {1}", i, f(i));
}
    public IQueryable<BookVerse> FindByVerseReferences(string bookCode, params VerseReference[] verseReferences)
    {
        var predicateBuilder = PredicateBuilder.New<BookVerse>();
        Expression<Func<BookVerse, bool>> predicate = null;
        foreach(VerseReference verseReference in verseReferences ?? new VerseReference[0])
        {
            Expression<Func<BookVerse, bool>> conditions = (x =>
                    x.BookCode == bookCode
                    && x.Chapter == verseReference.Chapter
                    && x.FirstVerse <= verseReference.LastVerse
                    && x.LastVerse >= verseReference.FirstVerse);
            predicate = predicateBuilder.Or(conditions);
        }
        return ObjectSpace.BookVerses.AsExpandable().Where(predicate);
    }