Функции расширения EF - PullRequest
1 голос
/ 28 ноября 2011

Я намерен использовать Linq для sql и EF 4.x, в одном проекте (по некоторым причинам),

но в EF есть кое-что, что IMO "Странно" вот так:

db.SomeTable.Where(x => x.Date > DateTime.Now.Date); 

который должен быть написан таким образом

db.SomeTable.Where(x => EntityFunctions.TruncateTime(x) > EntityFunctions.TruncateTime(DateTime.Now.Date)); 

Есть ли способ, я могу добавить функциональность в EF или изменить это поведение, потому что у LinqToSql нет этого странного синтаксиса

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

На самом деле можно перехватить запрос и переписать его. См. IQueryable.Provider и IQueryable.Expression свойства. Но это включает в себя написание пользовательского ExpressionVisitor для перевода вызова и очень быстро усложняется.

Если приведенный выше код является единственным несоответствием между Linq-To-SQL и EF, с которым вы столкнулись, вы можете переписать запрос следующим образом:

db.SomeTable.Where(x => x.Year == DateTime.Today.Year && x.Month == DateTime.Today.Month && x.Day == DateTime.Today.Day)

Я почти уверен, что EF должен поддерживать это сравнение, как и Linq-To-Sql.

Если вы хотите попробовать первое решение, я рекомендую вам создать IQueryable<T> -обёртку для ObjectSet<T>, возвращаемого EF, и установить точку останова при выполнении простых запросов и посмотреть, как дерево выражений фактически хранится в запрос, это может дать представление о том, что искать и чем его заменить.

1 голос
/ 28 ноября 2011

Нет способа изменить способ, которым EF анализирует запросы на лету.

Вы можете захватывать запросы на лету и редактировать их, используя http://metalinq.codeplex.com/, однако это может быть справедливымработы.

Вы можете переписать ваш запрос, чтобы он работал на обоих, хотя

...