2015-04-17 24 views
0

在我的代碼獲取日期我有以下使用LINQ表達式從一個DateTime屬性

ParameterExpression parameter = Expression.Parameter(typeof(TSource), "x"); 
MemberExpression property = Expression.Property(parameter, filterDataField); 

已工作的罰款,直至現在。但如果filterDataField是TSource中的DateTime屬性,我想獲取日期部分。例如。 x.Created.Date

這可能使用LinQ表達式和linq-to-sql(EntityFramework)?

編輯 該代碼是IQueryable的擴展方法的一部分,我創建了一個動態的Where方法。它採用屬性名稱(filterDataField),一個值和一個比較方法(所有字符串)。

這工作正常,但我希望擴展對DateTime屬性的支持,並且只能使用DateTime字段的Date部分,例如x.Created。 日期

+0

你的'filterDataField'來自哪裏?它定義了什麼對象類型? – krillgar

+0

filterDataField是一個字符串,它是我想要使用的屬性的名稱。 –

+0

你可以添加更多的代碼嗎?這不是我以前做過的事情,但我相信你可以使用反射來抓住這個屬性。我只需要看看代碼是怎麼做出來的。 – krillgar

回答

1

因爲我認爲在變量filterDataField命名的屬性爲DateTime類型的,你可以用你的建議,呼籲DateTime結構的Date財產。構建表達與被簡單地事後添加另一個屬性訪問表達式:

ParameterExpression parameter = Expression.Parameter(typeof(TSource), "x"); 
MemberExpression property = Expression.Property(parameter, filterDataField); 
MemberExpression dateOnlyProperty = Expression.Property(property, "Date"); 

注意最後一行,它只是增加了一個屬性訪問的第一個屬性,這在實踐中導致有點像x => x.DateProperty.Date而不是x => x.DateProperty

+0

這是一個非常簡單的解決方案。我之前沒有使用過所有這些'Expression'方法,如果你已經在這個空間中,肯定比倒影更容易使用。我很想看看這是如何使用的。 – krillgar

+0

我正在使用EntityFramework和linq-to-sql,但不幸的是,這對linq-to-sql無效。 –

+1

@krillgar它不同於反射,它構建了一個'Expression'而不是一個函數。看看「表達式」和「功能」之間的區別。 – Alejandro

相關問題