Компонуемые запросы LINQ к поддержке SQL?

Как работает анимация Se7ensky, так это то, что она использует стандартную технику тире анимации, но зажимает анимированный штрих контуром, изображающим рисованный внешний вид логотипа.

Таким образом, используется стандартная техника анимации тире следующим образом. Вы принимаете стандартную строку:

<svg>
  <path d="M 10,75 L 290,75" stroke="red" stroke-width="50"/>
</svg>

Затем вы добавляете к ней тире и анимируете ее позицию (stroke-dashoffset).

.pen {
  stroke-dasharray: 280 280;
  stroke-dashoffset: 280;
  animation-duration: 2s;
  animation-name: draw;
  animation-iteration-count: infinite;
  animation-direction: alternate;
  animation-timing-function: linear;
}

@keyframes draw {
  from {
    stroke-dashoffset: 280;
  }

  to {
    stroke-dashoffset: 0;
  }
}
<svg>
  <path class="pen" d="M 10,75 L 290,75" stroke="red" stroke-width="50"/>
</svg>

Наконец, чтобы получить визуальную переменную ширину штриха примера Se7ensky, вы обрезаете эту строку с контуром вашего логотипа.

Итак, давайте притворимся, что этот простой путь ниже представляет ваш логотип:

<svg>
  <path stroke="black" stroke-width="1" fill="lightgrey"
        d="M 40,50
           C 110,55 195,60, 265,55
           C 290,55 290,85 265,85
           C 195,85 110,85 40,100
           C 0,100 0,50 40,50 Z"/>
</svg>

Мы превращаем это в элемент clipPath и используем чтобы подрезать наш анимированный штрих до формы нашего логотипа:

.pen {
  stroke-dasharray: 280 280;
  stroke-dashoffset: 280;
  animation-duration: 2s;
  animation-name: draw;
  animation-iteration-count: infinite;
  animation-direction: alternate;
  animation-timing-function: linear;
}

@keyframes draw {
  from {
    stroke-dashoffset: 280;
  }

  to {
    stroke-dashoffset: 0;
  }
}
<svg>
  <clipPath id="logo">
    <path d="M 40,50
             C 110,55 195,60, 265,55
             C 290,55 290,85 265,85
             C 195,85 110,85 40,100
             C 0,100 0,50 40,50 Z"/>
  </clipPath>
  
  <path class="pen" d="M 10,75 L 290,75" stroke="red" stroke-width="50" clip-path="url(#logo)"/>
</svg>

Чтобы воспроизвести их пример, вам понадобится чтобы добавить непрерывный путь (или пути, если хотите) к вашему SVG, который представляет путь, который будет принимать перо, если бы он писал буквы в вашем логотипе.

Затем анимируйте этот путь, используя метод dashoffset while

Обновить

Вот заключительная демонстрация с более реалистичной формой буквы:

.pen {
  fill: none;
  stroke: red;
  stroke-width: 18;
  stroke-linecap: round;
  clip-path: url(#logo);

  stroke-dasharray: 206 206;
  stroke-dashoffset: 206;
  animation-duration: 2s;
  animation-name: draw;
  animation-iteration-count: infinite;
  animation-direction: alternate;
  animation-timing-function: linear;
}

@keyframes draw {
  from {
    stroke-dashoffset: 206;
  }

  to {
    stroke-dashoffset: 0;
  }
}
<svg>
  <defs>
    <clipPath id="logo">
      <path d="m85.77 49.77c-10.59 8.017-27.38 21.95-41.58 21.95-6.396 0-12.99-2.481-12.39-9.735l0.3998-4.199c38.38-12.03 48.17-26.15 48.17-35.5 0-7.635-7.995-9.162-14.39-9.162-25.98-0.1909-54.97 25.39-54.17 50.39 0.3998 12.6 7.196 25.01 21.79 25.01 19.79 0 41.78-17.94 53.97-31.5zm-52.37-1.336c5.397-12.6 16.99-21.76 26.98-24.24 1.399-0.3818 2.399 0.7635 2.399 2.1 0.1999 3.245-11.79 16.42-29.38 22.14z"/>
    </clipPath>
  </defs>
  
  <path d="m39.02 51.1c5.361-1.771 10.04-4.182 15.98-7.857 6.019-3.933 9.841-7.728 12.77-10.71 1.403-1.369 12.03-15.97-7.857-13.93-9.824 1.01-19.62 8.3-26.16 14.91-6.538 6.61-10.42 14.51-11.96 22.23-2.559 12.76 1.807 26.19 21.07 23.48 13.96-1.965 32.59-14.55 43.66-25.54" class="pen"/>
</svg>

5
задан Daniel Spiewak 18 September 2008 в 01:28
поделиться

5 ответов

Они компонуемы. Это возможно, потому что запросы LINQ являются на самом деле выражениями (код как данные), какие поставщики LINQ как LINQ-SQL могут оценить и генерировать соответствующий SQL.

Поскольку запросы LINQ лениво оценены (например, не будет выполняться, пока Вы не выполните итерации по элементам), код, который Вы показали, на самом деле не коснется базы данных. Только когда Вы выполняете итерации по otherPeople, или люди будут SQL быть сгенерированными и выполнились.

12
ответ дан 18 December 2019 в 07:58
поделиться
var people = from p in Person
             where p.age < 18
             select p

Переводит в:

SELECT [t0].[PersonId], [t0].[Age], [t0].[FirstName]
FROM [dbo].[Person] AS [t0]
WHERE [t0].[Age] < @p0

куда @p0 отправляется до как 18

var otherPeople = from p in people
                  where p.firstName equals "Daniel"
                  select p

Переводит в:

SELECT [t0].[PersonId], [t0].[Age], [t0].[FirstName]
FROM [dbo].[Person] AS [t0]
WHERE [t0].[FirstName] = @p0

куда @p0 отправляется до как "Daniel"

var morePeople = from p1 in people
                 from p2 in otherPeople
                 where p1.PersonId == p2.PersonId
                 select p1;

Переводит в:

SELECT [t0].[PersonId], [t0].[Age], [t0].[FirstName]
FROM [dbo].[Person] AS [t0], [dbo].[Person] AS [t1]
WHERE ([t0].[PersonId] = [t1].[PersonId]) AND ([t0].[Age] < @p0) AND ([t1].[FirstName] = @p1)

где @p0 равняется 18, @p1 является "Daniel"

Когда в сомнении, назовите ToString () на Вашем IQueryable или дайте TextWriter свойству DataContext's Log.

4
ответ дан 18 December 2019 в 07:58
поделиться

Да, получающийся запрос составлен. Это включает полное где пункт. Включите профилирование SQL и попробуйте его, чтобы лично убедиться.

Linq делает это через деревья выражений. Первый linq оператор производит дерево выражений; это не выполняет запрос. Второй linq оператор основывается на дереве выражений, созданном первым. Оператор только выполняется при перечислении получающегося набора.

3
ответ дан 18 December 2019 в 07:58
поделиться

people и otherPeople содержите объекты типа IQueryable<Person>.

Если Вы выполните итерации по обоим, separatly, то это выполнит два запроса. Если Вы только выполняете итерации otherPeople, это выполнит ожидаемый запрос, с два где пункты.

Если Вы делаете .ToList() на people и используйте возвращенный List<Person> во втором запросе вместо людей это становится LINQ к объектам, и никакой SQL не выполняется.

Это поведение упоминается как задержанное выполнение. Значение никакого запроса сделано, пока оно не необходимо. Перед выполнением они - просто деревья выражений, которыми управляют для формулировки заключительного запроса.

1
ответ дан 18 December 2019 в 07:58
поделиться

Оба этих запроса будут, выполняется, когда Вы попытаетесь получить доступ к конечным результатам. Можно попытаться просмотреть исходный SQL, сгенерированный от свойств объектов DataContext.

0
ответ дан 18 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: