Структура Entity основана на LINQ. Linq называется декларативным языком, что означает столько, сколько говорить , что делать вместо , как делать это (обязательно). Заявление вроде
context.Orders.Select(o => o.OrderDate).Distinct();
это декларативный ярлык, если хотите, для выражения 'церемониальный' foreach
, в котором OrderDate
s добавляются в список, если они ранее не были добавлены к нему.
Я не являюсь экспертом в NHibernate или его API критериев, но критерии API, похоже, еще более декларативные, чем linq. Это затрудняет их сравнение. Несколько отличий:
- The main one: query by example is not possible in EF.
- There is no way in linq to set behaviours for a whole query. For instance, if you want to exclude zero valued properties, you'll have to specify each one of them in a
where
predicate (which is closer to telling how to filter).
Case sensitivity is downright underdeveloped in EF. For example, a statement like
People.Where(c => string.Compare( c.Name, "z", false) > 0)
will generate the same SQL as
People.Where(c => string.Compare( c.Name, "z", true) > 0)
The database collation determines the case sensitiveness of string comparisons.
You can do LIKE
queries, but, again, specified for each individual predicate:
People.Where (c => c.Name.Contains("a"))
(again: no differentiation in case)
Поэтому я не могу дать перевод запроса по критериям linq. Я должен знать свойства класса, чтобы иметь возможность указывать все индивидуальные предикаты.