SqlException об ОБЪЕДИНЕНИИ, ПЕРЕСЕКИТЕСЬ и КРОМЕ

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

<div class="wrapper">
  <img src="../../1021.png" alt class="img img-fluid">
  <div class="text">Here is your text</div>
</div>

И CSS:

.wrapper {
  position: relative;
  width: 100%;
}

.wrapper img {
  position: relative;
  z-index: 0;
}

.wrapper .text {
  position: absolute;
  z-index: 10;
  bottom: 0;
}

Подстройтесь под свои нужды Принцип заключается в том, что ваш текст & amp; оба элемента изображения содержатся в оболочке, которая должна иметь относительное положение, чтобы вы могли затем изменить текст с абсолютным позиционированием относительно оболочки. Также обратите внимание на z-индексирование, чтобы текст находился сверху изображения.

6
задан John Saunders 15 August 2013 в 00:14
поделиться

8 ответов

Так как это похоже на проблему со сгенерированным SQL, необходимо попытаться использовать или SQL Profiler или использовать этот код для класса записи DebuggerWritter SQL к Окну вывода в Visual Studio.

Ошибка SQL обычно вызывается полями, полученными для ОБЪЕДИНЕНИЯ, не то же для 2 запросов. Например, если первый запрос мог бы иметь 3 поля, но второй запрос имеет 4 поля, эта ошибка произойдет. Так, наблюдение сгенерированного SQL определенно поможет в этом случае.

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

Можно ли, возможно, записать это в едином запросе?

.Where(row => row.ForeignKey == null || row.ForeignKey.SomeCondition);

Существуют также способы объединить выражения (OrElse), но это не тривиально.

Не уверенный, куда ошибка прибывает из, хотя!

править: не протестировали его, но это должно быть логически эквивалентно ОБЪЕДИНЕНИЮ:

public static IQueryable<T> WhereAnyOf<T>(
    this IQueryable<T> source,
    params Expression<Func<T, bool>>[] predicates)
{
    if (source == null) throw new ArgumentNullException("source");
    if (predicates == null) throw new ArgumentNullException("predicates");
    if (predicates.Length == 0) return source.Where(row => false);
    if (predicates.Length == 1) return source.Where(predicates[0]);

    var param = Expression.Parameter(typeof(T), "row");
    Expression body = Expression.Invoke(predicates[0], param);
    for (int i = 1; i < predicates.Length; i++)
    {
        body = Expression.OrElse(body,
            Expression.Invoke(predicates[i], param));
    }
    return source.Where(Expression.Lambda<Func<T, bool>>(body, param));
}
0
ответ дан 8 December 2019 в 18:41
поделиться

запросите = a. Объединение (b);

Не хорошая идея видоизменить полученные переменные... Вероятно, причина ошибки.

ОБНОВЛЕНИЕ: хорошо нет

Вот другая идея. Подсказка находится в сообщении об ошибке.

var a = query
         .Where(some foreign key is null)
         .Select(x => x);

Или игра путем добавления другой 'фальшивки', Где, пока они действительно не становятся равными :)

0
ответ дан 8 December 2019 в 18:41
поделиться

Вы являетесь случайно передающими в значении 'избранной' стороне в переменной, или Вы возвращаете то же поле несколько раз? SP1 представил ошибку, где он пытается 'оптимизировать' такие вещи, и это может заставить запросы на объединение повреждаться (из-за частей запроса, 'оптимизирующих' отличающийся, передал - в параметрических усилителях).

При регистрации фактического запроса, а не псевдо кода, он помогает определить, если это верно.

(И обходное решение, если это верно, должно осуществить отдельные части сначала и затем сделать клиентское объединение (L2O)).

0
ответ дан 8 December 2019 в 18:41
поделиться

Я звонил бы data.GetCommand(query) и проанализируйте получающееся DbCommand (особенно сгенерированная строка SQL). Это должно дать Вам ключ к разгадке того, что идет не так, как надо.

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

Вы могли попытаться уменьшить свой запрос до меньшего, который все еще не работает. Запустите с query.Union(query) (это должно, по крайней мере, работать). Чем добавляют Ваш Where вызовы один за другим для наблюдения, когда это прекращает работать.

Это должен быть один из Вашего Where вызовы, который добавляет дополнительные столбцы к Вашему списку выборки.

0
ответ дан 8 December 2019 в 18:41
поделиться

Судя по указанной вами ошибке SQL, возможно, вы столкнулись с той же проблемой, что и я. В основном, когда запросы Linq to SQL, которые используют метод расширения Concat или Union для двух разных запросов, кажется, что есть ошибка в Linq to SQL, которая оптимизирует каждую проекцию отдельно, без учета того факта, что проекция должна оставаться такой же, чтобы выполнить соединение SQL.

Ссылки:

LINQ to SQL создает неверный TSQL при использовании UNION или CONCAT

Linq to SQL Union Ошибка создания одинакового имени поля

Если это тоже ваша проблема, я обнаружил решение, которое работает для меня, как показано ниже.

var queryA = 
    from a in context.TableA
    select new 
    {
        id,
        name,
        onlyInTableA,
    }

var queryB = 
    from b in context.TableB
    let onlyInTableA = default(string)
    select new 
    {
        id,
        name,
        onlyInTableA,
    }

var results = queryA.Union(queryB).ToList();
9
ответ дан 8 December 2019 в 18:41
поделиться

jpierson правильно суммировал проблему.
У меня также была проблема, на этот раз вызванная некоторыми литералами в операторе select:
Dim results = (From t in TestDataContext.Table1 _
Где t.ID = WantedID _
Выберите t.name, SpecialField = 0, AnotherSpecialField = 0, t.Address) .Union _
Из t в TestDataContext.Table1 _
Где t.SecondID = WantedSecondID _
Select t.name, SpecialField = 1, AnotherSpecialField = 0, t.Address)

The first sub-query of "SpecialField = 0" and the "AnotherSpecialField = 0" were optimised, resulting in one field instead of two being used in the union, which will obviously fail.
I had to change the first query so that the SpecialField & AnotherSpecialField had different values, much like in the second sub-query.

0
ответ дан 8 December 2019 в 18:41
поделиться

У меня возникла проблема с этим. Используя Sql 08, я имел две функции таблицы, которые возвращали int и строку в обоих случаях. Я создал сложный объект и использовал linq для попытки UNION. Для сравнения использовал IEqualityComparer. Все скомпилировалось нормально, но произошел сбой при неподдерживаемой перегрузке. Так, я понял, что обсуждаемая проблема, похоже, связана с отложенным выполнением. Поэтому я получаю коллекции и размещаю ToList(), затем выполняю UNION, и все в порядке. Не уверен, что это поможет, но у меня это работает

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

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