Библиотека динамических запросов LINQ
Я создаю приложение ASP.Net MVC 3 с Entity Framework 4. Когда выполняются два фрагмента кода ниже, обе переменные (query1 и query2) имеют возвращаемый тип
System.Data.Objects.ObjectQuery<Asset.Model.Equipment>
Query1 использует прямой экземпляр ObjectContext, однако Query2 использует шаблон репозитория, то есть он вызывает GetEquipment в EquipmentService, который, в свою очередь, вызывает метод с тем же именем в репозитории оборудования. Оба метода в Сервисе и Репозитории возвращают
IQueryable<Equipment>
Как, вот мой вопрос, почему query2 будет работать только тогда, когда я включаю
using System.Linq.Dynamic;
В верхней части моего контроллера
using (AssetEntities context = new AssetEntities())
{
var query1 = context.Equipments
.OrderBy("it." + sidx + " " + sord)
.Skip(pageIndex * pageSize)
.Take(pageSize);
}
var query2 = equipService.GetEquipment()
.OrderBy(sidx + " " + sord)
.Skip(pageIndex * pageSize)
.Take(pageSize);
Если я опускаю System.Linq.Dynamic из моего контроллера, я получаю ошибку в Query2 в
.OrderBy(sidx + " " + sord)
Какие состояния
The type arguments for method 'System.Linq.Queryable.OrderBy<TSource,TKey>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,TKey>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly
Кто-нибудь знает, почему query1 может работать без необходимости использовать System.Linq.Dynamic, но этот query2 нуждается в его выполнении?
Спасибо всем.
2 ответа
В первом запросе context.Equipments
имеет тип ObjectQuery<Equipment>
, ObjectQuery<T>
имеет метод OrderBy (string), который нужен для .OrderBy("it." + sidx + " " + sord)
, Итак, первый запрос работает.
Во втором запросе вы используете equipService.GetEquipment()
типа IQueryable<Equipment>
, IQueryable<T>
имеет только метод расширения OrderBy с Expression<Func<T, TKey>>
в качестве параметра вместо string
, Так использовать OrderBy
с IQueryable<Equipment>
ты должен написать что-то вроде
equipService.GetEquipment().OrderBy(e => e.equipmentID)
но это не то, что вы можете использовать. Вам нужен другой метод расширения, который может предоставить вам библиотеку динамических запросов LINQ в форме System.Linq.Dynamic
,
Во многих случаях LINQ to Entities имеет много ограничений, но в вашем случае он имеет больше преимуществ, чем LINQ to SQL. Поэтому я рекомендую вам придерживаться LINQ to Entities в вашем случае. Я уверен, что таким образом вы получите лучшую производительность из-за встроенной поддержки всех функций непосредственно в Entity Framework, который вы используете.
Потому что LINQ to Entities или ObjectQuery<Equipment>
опоры Where(string)
Метод (точнее, ObjectQuery.Where(строковый предикат, params ObjectParameter[] параметры) метод) вы можете относительно легко реализовать фильтрацию / поиск в jqGrid. Использование .Where
может быть
.Where("it.equipmentID < 100")
или же
.Where("it.equipmentID < @maxId", new ObjectParameter ("maxId", 100))
например (использование "maxId" вместо "@maxId" в ObjectParameter
не печатать ошибку).
ОБНОВЛЕНО: В части ответа "ОБНОВЛЕНО" вы можете найти пример, который показывает, как реализовать фильтрацию / поиск в jqGrid на основе идеи, которую я описал выше.
"it" - это значение свойства ObjectQuery.Name по умолчанию. Фактически, когда вы используете первый запрос, вы выполняете неявное предложение Entity SQL Order By, в то время как во втором вы используете LINQ to Entities, и ему требуется пространство имен System.Linq.Dynamic для корректной работы.