Skip to content

SQL Syntax Error During Update #205

@inosyryev

Description

@inosyryev

LINQ

repository.EngineeringCircuitEnds
    .Where(x => ids.Contains(x.EngineeringCircuitID))
    .Select(x => x.EngineeringConnectoRef)
    .Distinct()
    .Set(y => y.ConfirmedEndView, y => y.EngineeringCircuits.All(x => x.ConfirmedEndView))
    .Update();

SQL

UPDATE
    [t2]
SET
    [ConfirmedEndView] = (NOT EXISTS(
        SELECT
            *
        FROM
            [EngineeringCircuitEnd] [c]
        WHERE
            [t2].[EngineeringConnectorID] = [c].[EngineeringConnectorID] AND
            NOT ([c].[ConfirmedEndView] = 1)
    ))
FROM
    [EngineeringCircuitEnd] [x]
        INNER JOIN [EngineeringConnector] [t2]
            INNER JOIN [EngineeringCircuitEnd] [t1] ON [t2].[EngineeringConnectorID] = [t1].[EngineeringConnectorID]
        ON [x].[EngineeringConnectorID] = [t2].[EngineeringConnectorID]
WHERE
    [x].[EngineeringCircuitID] IN (4094837, 4095281, 4097457)

Problems

  1. Operation 'ExecuteNonQuery' throws exception 'BLToolkit.Data.DataException: Incorrect syntax near the keyword 'NOT'.
  2. Following expression is not required and makes a performance impact: INNER JOIN [EngineeringCircuitEnd] [t1] ON [t2].[EngineeringConnectorID] = [t1].[EngineeringConnectorID]

Workarounds

A workaround for problem 1 is an explicit usage of "? true : false" like:

repository.EngineeringCircuitEnds
    .Where(x => ids.Contains(x.EngineeringCircuitID))
    .Select(x => x.EngineeringConnectoRef)
    .Distinct()
    .Set(y => y.ConfirmedEndView, y => y.EngineeringCircuits.All(x => x.ConfirmedEndView) ? true : false)
    .Update();

Generated file

//---------------------------------------------------------------------------------------------------
// This code was generated by BLToolkit.
//---------------------------------------------------------------------------------------------------
using System;
using System.Linq.Expressions;

using NUnit.Framework;

namespace SPX.DEF.FromTo.UnitTest
{
    [System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
    class <>c__DisplayClassc
    {
        public Int64[] ids;
    }
}

namespace SPX.GCIS.Data.Sql
{
    [BLToolkit.DataAccess.TableNameAttribute(Name = "EngineeringCircuitEnd")]
    public class EngineeringCircuitEndRecord
    {
        [BLToolkit.Mapping.AssociationAttribute(ThisKey = "EngineeringConnectorID", OtherKey = "EngineeringConnectorID", CanBeNull = False)]
        public SPX.GCIS.Data.Sql.EngineeringConnectorRecord EngineeringConnectoRef { get; set; }

        [BLToolkit.DataAccess.PrimaryKeyAttribute((Int32)1)]
        [BLToolkit.DataAccess.IdentityAttribute()]
        public Int64 EngineeringCircuitID { get; set; }

        public bool ConfirmedEndView { get; set; }
    }
}

namespace SPX.GCIS.Data.Sql
{
    [BLToolkit.DataAccess.TableNameAttribute(Name = "EngineeringConnector")]
    public class EngineeringConnectorRecord
    {
        [BLToolkit.Mapping.AssociationAttribute(ThisKey = "EngineeringConnectorID", OtherKey = "EngineeringConnectorID", CanBeNull = False)]
        public System.Collections.Generic.List<SPX.GCIS.Data.Sql.EngineeringCircuitEndRecord> EngineeringCircuits { get; set; }

        public bool ConfirmedEndView { get; set; }
    }
}

namespace Data.Linq
{
    [TestFixture]
    public class UserTest : TestBase
    {
        [Test]
        public void Test()
        {
            // Table(EngineeringCircuitEndRecord).Where(x => value(SPX.DEF.FromTo.UnitTest.BlToolkitTesting+<>c__DisplayClassc).ids.Contains(x.EngineeringCircuitID)).Select(x => x.EngineeringConnectoRef).Distinct().Set(y => y.ConfirmedEndView, y => y.EngineeringCircuits.All(x => x.ConfirmedEndView)).Update()
            ForEachProvider(db =>
                Table(EngineeringCircuitEndRecord)
                    .Where<SPX.GCIS.Data.Sql.EngineeringCircuitEndRecord>(
                        (SPX.GCIS.Data.Sql.EngineeringCircuitEndRecord x) => value(SPX.DEF.FromTo.UnitTest.BlToolkitTesting+<>c__DisplayClassc).ids
                            .Contains<Int64>(
                                x.EngineeringCircuitID))
                    .Select<SPX.GCIS.Data.Sql.EngineeringCircuitEndRecord,SPX.GCIS.Data.Sql.EngineeringConnectorRecord>(
                        (SPX.GCIS.Data.Sql.EngineeringCircuitEndRecord x) => x.EngineeringConnectoRef)
                    .Distinct<SPX.GCIS.Data.Sql.EngineeringConnectorRecord>()
                    .Set<SPX.GCIS.Data.Sql.EngineeringConnectorRecord,bool>(
                        (SPX.GCIS.Data.Sql.EngineeringConnectorRecord y) => y.ConfirmedEndView,
                        (SPX.GCIS.Data.Sql.EngineeringConnectorRecord y) => y.EngineeringCircuits
                            .All<SPX.GCIS.Data.Sql.EngineeringCircuitEndRecord>(
                                (SPX.GCIS.Data.Sql.EngineeringCircuitEndRecord x) => x.ConfirmedEndView))
                    .Update<SPX.GCIS.Data.Sql.EngineeringConnectorRecord>());
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions