2014-01-25 35 views
1

如何编写ac#LINQ谓词表达式,以便创建一个类似于以下内容的谓词:“Select ... from customer where orders.orderDate> '01/24/2014'”
I我想它是这样,但不知道如何准确地构建它:Predicate Expression filtring

Expression<Func<Cutomser, bool>> predicates = PredicateBuilder.True<Cutomser>();   
predicates = predicates.And(x => x.Orders.OrderDate > DateTime.Now.AddDays(-1)) 

我想拥有它认为有订单日期大于01 /2014分之24' 的所有订单。 Customer类拥有Orders类型集合的属性。

回答

0

看来您正在尝试为连接中的第二个表创建连接和谓词。 谓词应该是第二个表的类型,而不是第一个。

var predicates = PredicateBuilder.True<Order>();   
DateTime specificDate = new DateTime(2014, 01, 24); 
predicates = predicates.And(Order => Order.OrderDate > specificDate) 

然后你它适用于您的订单加入子句中:

IQueryable<Customer> source = database.Customers; 
var results = source.SelectMany(
    customer => customer.Orders, 
    (customer, order) => order).Where(predicates); 
+0

关闭。但是你不能使用x.Orders.OrderDate。 Becasue Orders是一个集合。像这样使用它需要像x.Orders [0] .OrderDate这样的索引。 – Jay

+0

好的。这将工作,但如何结合:predicates = PredicateBuilder.True ();和predicates2 = PredicateBuilder.True (); – Jay

+0

@Jay结合什么? – i3arnon

0

见,如果这个工程:

var orderDate = new DateTime(2014, 24, 1); 

predicates = predicates.And(x => x.Orders.Any(y => y.OrderDate > orderDate); 
+0

不完全,如果它发现OrderDate大于日期的一个Order,则条件将返回true。我正在努力为所有满足条件的人做到这一点。也使用Orders.All()不起作用。因为如果所有的都大于日期,那只会返回true。 – Jay

+0

@Jay你想*为所有*做,而不是'全部'?你什么意思? –