2014-01-25 36 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你想*爲所有*做,而不是'全部'?你什麼意思? –