Выполнение части запроса IQueryable и задержка остальных к Linq для Объектов

Я предлагаю вам сначала попытаться увидеть, сколько узлов диалога находится в исходной рабочей области / навыке. Обратитесь к этой странице документации Watson Assistant на границах узла диалога для получения подробной информации. Ограничение узла диалога для облегченных планов изменилось:

Ограничения были изменены с 25 000 до 100 для облегченных планов 1 декабря 2018 года. Пользователи экземпляров служб, которые были созданы до изменения ограничения, имеют до 1 июня 2019 года обновите свой план или отредактируйте диалоги в навыках в существующих экземплярах службы, чтобы соответствовать новым лимитным требованиям.

blockquote>

Инструкции на этой странице документации предоставляют два способа проверки количества диалоговых узлов. Одним из них является добавление навыка к новому помощнику, а затем нажмите на него для деталей. Он покажет количество обученных диалоговых узлов. Другой вариант - использовать API (или окружающий его SDK) для запроса количества узлов диалога.

8
задан Tim Jarvis 30 March 2009 в 22:37
поделиться

5 ответов

То, что мне было нужно, - это замена константы Queryable <> в дереве выражений конкретным IEnumerable (или IQueryable через .AsQueryable ()) ... это сложная тема, которая, вероятно, имеет смысл только для авторов Linq Provider, которые по колено в посетителях дерева выражений и т.д. .

using System;
using System.Linq;
using System.Linq.Expressions;

namespace LinqToTerraServerProvider
{
    internal class ExpressionTreeModifier : ExpressionVisitor
    {
        private IQueryable<Place> queryablePlaces;

        internal ExpressionTreeModifier(IQueryable<Place> places)
        {
            this.queryablePlaces = places;
        }

        internal Expression CopyAndModify(Expression expression)
        {
            return this.Visit(expression);
        }

        protected override Expression VisitConstant(ConstantExpression c)
        {
            // Replace the constant QueryableTerraServerData arg with the queryable Place collection.
            if (c.Type == typeof(QueryableTerraServerData<Place>))
                return Expression.Constant(this.queryablePlaces);
            else
                return c;
        }
    }
}
3
ответ дан 5 December 2019 в 14:06
поделиться

Ответ Rob хорош, но вызывает полное перечисление. Вы могли бросить для хранения дополнительного синтаксиса метода и отложенных вычислений:

var res = ((IEnumerable<Foo>)dc.Foos
            .Where(x => x.Bla > 0))  // IQueryable
          .Where(y => y.Snag > 0)   // IEnumerable
0
ответ дан 5 December 2019 в 14:06
поделиться

Если я не неправильно понимаю, я обычно просто добавляю.ToArray () в цепочке linq методов в точке, где я хочу, чтобы linq поставщик выполнился.

Например (думают Linq к SQL),

var result = datacontext.Table
   .Where(x => x.Prop == val)
   .OrderBy(x => x.Prop2)
   .ToArray()
   .Select(x => new {CoolProperty = x.Prop, OtherProperty = x.Prop2});

Таким образом через OrderBy () переводится в SQL, но Выбор () является LINQ к Объектам.

1
ответ дан 5 December 2019 в 14:06
поделиться

Обе из предыдущей работы ответов, но это читает лучше при использовании AsEnumerable () для кастинга IQueryable к IEnumerable:

// Using Bob's code...
var result = datacontext.Table
   .Where(x => x.Prop == val)
   .OrderBy(x => x.Prop2)
   .AsEnumerable()  //  <---- anything after this is done by LINQ to Objects
   .Select(x => new { CoolProperty = x.Prop, OtherProperty = x.Prop2 });

Править:

// ... or MichaelGG's
var res = dc.Foos
           .Where(x => x.Bla > 0)  // uses IQueryable provider
           .AsEnumerable()
           .Where(y => y.Snag > 0); // IEnumerable, uses LINQ to Objects
6
ответ дан 5 December 2019 в 14:06
поделиться

Если вы реализовали шаблон репозитория, вы могли бы просто предоставить IQueryable назад и абстрагироваться от таблицы.

Пример:

var qry = from c in MyProv.Repository<Customer>()
          Join o in MyProv.Repository<Order>() on c.OrderID equals o.ID
          select new 
          {
            CustID = c.ID,
            OrderID = o.ID
          }

, а затем просто создайте своего провайдера для моделирования шаблона IQueryable в вашем методе репозитория, как показано в этой статье .

Таким образом, вы можете написать все виды провайдеров, которые будут использовать все, что вам нужно. Вы можете иметь поставщика LINQ 2 SQL или написать поставщика в памяти для своих модульных тестов.

Метод репозитория для поставщика LINQ 2 SQL будет выглядеть примерно так:

public IQueryable<T> Repository<T>() where T : class
{
    ITable table = _context.GetTable(typeof(T));
    return table.Cast<T>();
}
2
ответ дан 5 December 2019 в 14:06
поделиться
Другие вопросы по тегам:

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