Что такое «это» в Entity Framework - PullRequest
4 голосов
/ 17 июля 2011

Простите, если об этом уже спрашивали, но «это» не появляется ни в одном из моих поисков. У меня есть две таблицы базы данных Person и Employee, которые моделируют таблицу для каждого типа (например, Employee is-Person). В моем редакторе edmx я определил одного сотрудника, который сопоставляет каждый столбец с соответствующей таблицей (например, Имя -> Персона, Зарплата -> Сотрудник).

"это" позволяет мне делать такие вещи в выражении LINQ:

context.Employees.Where("it.Name LIKE 'M%' AND it.Salary > 1234")

Есть ли хорошие ссылки, объясняющие, как я могу ожидать, что "это" будет вести себя? Я предполагаю, что это не универсальная вещь LINQ и что она в некоторой степени специфична для Entity Framework.

РЕДАКТИРОВАТЬ 0: Сгенерированный код C # для ObjectContext следует:

public partial class TestObjectContext : ObjectContext
{
  // lots of boilerplate removed for clarity

  public ObjectSet<Employee> Employees
  {
    get
    {
      if ((_Employees == null))
      {
        _Employees = base.CreateObjectSet<Employee>("Employees");
      }
      return _Employees;
    }
  }
}

Ответы [ 2 ]

7 голосов
/ 17 июля 2011

it является псевдонимом по умолчанию для текущей команды ObjectQuery.Пожалуйста, обратитесь к документации для методов Построителя запросов, особенно раздела Псевдоним:

Методы построителя запросов применяются последовательно для создания команды накопительного запроса.Это означает, что текущая команда ObjectQuery обрабатывается как подзапрос, к которому применяется текущий метод.

В методе построителя запросов вы ссылаетесь на текущую команду ObjectQuery, используя псевдоним.По умолчанию строка «it» является псевдонимом, который представляет текущую команду, как в следующем примере:

int cost = 10;
// Return Product objects with a standard cost
// above 10 dollars.
ObjectQuery<Product> productQuery =
    context.Products
           .Where("it.StandardCost > @cost", new ObjectParameter("cost", cost));

Когда вы устанавливаете свойство Name объекта ObjectQuery, это значение становится псевдонимом в последующих методах,Следующий пример расширяет предыдущий, устанавливая имя ObjectQuery равным «product», а затем используя этот псевдоним в последующем методе OrderBy:

// Set the Name property for the query and then 
// use that name as the alias in the subsequent 
// OrderBy method.
productQuery.Name = "product";
ObjectQuery<Product> filteredProduct = productQuery.OrderBy("product.ProductID");
1 голос
/ 17 июля 2011

Вы говорите о библиотеке Dynamic LINQ.

Если у вас установлена ​​VS 2008, вы можете найти подробный документ по API на

<path to vs2008>\Samples\1033\CSharpSamples\LinqSamples\DynamicQuery\Dynamic Expressions.html

Или скачать с здесь

Вот статья Скотта Гу о Dynamic LINQ

Вот выдержка из файла Dynamic Expressions.html.

Текущий экземпляр

При разборе лямбда-выражения с одним безымянным параметром члены безымянного параметра автоматически попадают в область видимости в строке выражения, и на текущий экземпляр, заданный безымянным параметром, можно ссылаться в целом, используя ключевое слово it. Например,

customers.Where("Country = @0", country);

эквивалентно

customers.Where("it.Country = @0", country);

Все методы расширения IQueryable анализируют свои аргументы выражений как лямбда-выражения с одним безымянным параметром.

Динамический лямбда-вызов

Выражение может ссылаться на другие динамические лямбда-выражения через динамические лямбда-вызовы. Динамический лямбда-вызов состоит из идентификатора переменной подстановки, который ссылается на экземпляр System.Linq.Expressions.LambdaExpression, за которым следует список аргументов. Предоставленные аргументы должны быть совместимы со списком параметров данного динамического лямбда-выражения.

Следующее анализирует два отдельных динамических лямбда-выражения, а затем объединяет их в выражение предиката с помощью динамических лямбда-вызовов:

Expression<Func<Customer, bool>> e1 = 
    DynamicExpression.ParseLambda<Customer, bool>("City = \"London\"");
Expression<Func<Customer, bool>> e2 =
    DynamicExpression.ParseLambda<Customer, bool>("Orders.Count >= 10");
IQueryable<Customer> query =
    db.Customers.Where("@0(it) and @1(it)", e1, e2);

Конечно, можно комбинировать статические и динамические лямбда-выражения следующим образом:

Expression<Func<Customer, bool>> e1 =
    c => c.City == "London";
Expression<Func<Customer, bool>> e2 =
    DynamicExpression.ParseLambda<Customer, bool>("Orders.Count >= 10");
IQueryable<Customer> query =
    db.Customers.Where("@0(it) and @1(it)", e1, e2);

Оба приведенных выше примера имеют такой же эффект, как:

IQueryable<Customer> query =
    db.Customers.Where(c => c.City == "London" && c.Orders.Count >= 10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...