dataobjects-net icon indicating copy to clipboard operation
dataobjects-net copied to clipboard

Contains by value with type cast throw The given key 'IndexProvider' was not present in the dictionary

Open letarak opened this issue 5 months ago • 0 comments

DO 7.1.1

Sample

NB Code without PairTo association throw 'FilterProvider' exception

using DoTest;
using Microsoft.Data.SqlClient;
using Xtensive.Orm;
using Xtensive.Orm.Configuration;

internal class Program
{
    private static async Task Main(string[] args)
    {
        try
        {
            DbHelper.ExecuteNonQuery("DROP DATABASE [DO-Tests]");
        }
        catch (Exception)
        {
        }

        DbHelper.ExecuteNonQuery("CREATE DATABASE [DO-Tests]");

        var currentConnection = new SqlConnectionStringBuilder(DbHelper.ConnectionString());

        var dc = new DomainConfiguration("sqlserver", currentConnection.ToString());

        dc.Types.Register(typeof(TestEntity));
        dc.Types.Register(typeof(LinkEntity));
        dc.Types.Register(typeof(Descendant));

        dc.UpgradeMode = DomainUpgradeMode.Recreate;

        await using var d = await Domain.BuildAsync(dc);
        
        await using (var s = await d.OpenSessionAsync())
        await using (var t = await s.OpenTransactionAsync())
        {
            _ = s.Query.All<TestEntity>()
                .Where(it => it.List.Select(e => e.Name).Contains((it.Link as Descendant).DescendantField))
                .ToArray();

            t.Complete();
        }
    }
}

[HierarchyRoot]
internal class LinkEntity : Entity
{
    public LinkEntity(Session session) : base(session)
    {
    }

    [Key] 
    [Field(Nullable = false)] 
    public int Id { get; set; }

    [Field(Nullable = false)] 
    public string Name { get; set; }
        
    [Field] 
    public TestEntity Link { get; set; }
}

internal class Descendant : LinkEntity
{
    /// <inheritdoc />
    public Descendant(Session session) : base(session)
    {
    }

    [Field(Nullable = false)] 
    public string DescendantField { get; set; }
}

[HierarchyRoot]
internal class TestEntity : Entity
{
    public TestEntity(Session session) : base(session)
    {
    }

    [Key] 
    [Field(Nullable = false)] 
    public int Id { get; set; }

    [Field(Nullable = false)] 
    public string Name { get; set; }

    [Field] 
    public LinkEntity Link { get; set; }
        
    [Field] 
    [Association(PairTo = "Link")]
    public EntitySet<LinkEntity> List { get; set; }
}

Exception

Unhandled exception. Xtensive.Orm.QueryTranslationException: Unable to translate 'Query.All().Where(it => it.List.Select(e => e.Name).Contains((it.Link as Descendant).Name))' expression. See inner exception for details.
 ---> System.Collections.Generic.KeyNotFoundException: The given key 'IndexProvider' was not present in the dictionary.
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at Xtensive.Orm.Rse.Transformation.ApplyPredicateCollector.TryAdd(FilterProvider filter)
   at Xtensive.Orm.Rse.Transformation.ApplyProviderCorrectorRewriter.VisitFilter(FilterProvider provider)
   at Xtensive.Orm.Rse.Providers.ProviderVisitor.Visit(CompilableProvider cp)
   at Xtensive.Orm.Rse.Providers.CompilableProviderVisitor.VisitCompilable(CompilableProvider cp)
   at Xtensive.Orm.Rse.Transformation.ApplyProviderCorrectorRewriter.VisitFilter(FilterProvider provider)
   at Xtensive.Orm.Rse.Providers.ProviderVisitor.Visit(CompilableProvider cp)
   at Xtensive.Orm.Rse.Providers.CompilableProviderVisitor.VisitCompilable(CompilableProvider cp)
   at Xtensive.Orm.Rse.Providers.CompilableProviderVisitor.VisitExistence(ExistenceProvider provider)
   at Xtensive.Orm.Rse.Providers.ProviderVisitor.Visit(CompilableProvider cp)
   at Xtensive.Orm.Rse.Providers.CompilableProviderVisitor.VisitCompilable(CompilableProvider cp)
   at Xtensive.Orm.Rse.Transformation.ApplyProviderCorrectorRewriter.VisitBinaryProvider(BinaryProvider provider, CompilableProvider& left, CompilableProvider& right)
   at Xtensive.Orm.Rse.Transformation.ApplyProviderCorrectorRewriter.VisitApply(ApplyProvider provider)
   at Xtensive.Orm.Rse.Providers.ProviderVisitor.Visit(CompilableProvider cp)
   at Xtensive.Orm.Rse.Providers.CompilableProviderVisitor.VisitCompilable(CompilableProvider cp)
   at Xtensive.Orm.Rse.Transformation.ApplyProviderCorrectorRewriter.VisitFilter(FilterProvider provider)
   at Xtensive.Orm.Rse.Providers.ProviderVisitor.Visit(CompilableProvider cp)
   at Xtensive.Orm.Rse.Providers.CompilableProviderVisitor.VisitCompilable(CompilableProvider cp)
   at Xtensive.Orm.Rse.Transformation.ApplyProviderCorrectorRewriter.VisitSelect(SelectProvider provider)
   at Xtensive.Orm.Rse.Providers.ProviderVisitor.Visit(CompilableProvider cp)
   at Xtensive.Orm.Rse.Providers.CompilableProviderVisitor.VisitCompilable(CompilableProvider cp)
   at Xtensive.Orm.Rse.Transformation.ApplyProviderCorrectorRewriter.Rewrite(CompilableProvider rootProvider)
   at Xtensive.Orm.Rse.Transformation.ApplyProviderCorrector.Process(CompilableProvider rootProvider)
   at Xtensive.Orm.Rse.Compilation.CompositePreCompiler.Process(CompilableProvider rootProvider)
   at Xtensive.Orm.Providers.CompilationService.Compile(CompilableProvider provider, CompilerConfiguration configuration)
   at Xtensive.Orm.Linq.Translator.Translate(ProjectionExpression projection, IEnumerable`1 tupleParameterBindings)
   at Xtensive.Orm.Linq.Translator.Translate()
   at Xtensive.Orm.Linq.QueryProvider.Translate(Expression expression, CompilerConfiguration compilerConfiguration)
   --- End of inner exception stack trace ---
   at Xtensive.Orm.Linq.QueryProvider.Translate(Expression expression, CompilerConfiguration compilerConfiguration)
   at Xtensive.Orm.Linq.QueryProvider.Translate(Expression expression)
   at Xtensive.Orm.Linq.QueryProvider.Execute[TResult](Expression expression, Func`4 runQuery)
   at Xtensive.Orm.Linq.QueryProvider.ExecuteSequence[T](Expression expression)
   at Xtensive.Orm.Linq.Queryable`1.GetEnumerator()
   at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items)
   at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at Program.Main(String[] args) in /Users/anton.guschin/RiderProjects/DoTest/DoTest/Program.cs:line 35
   at Program.Main(String[] args) in /Users/anton.guschin/RiderProjects/DoTest/DoTest/Program.cs:line 40
   at Program.Main(String[] args) in /Users/anton.guschin/RiderProjects/DoTest/DoTest/Program.cs:line 40
   at Program.Main(String[] args) in /Users/anton.guschin/RiderProjects/DoTest/DoTest/Program.cs:line 40
   at Program.<Main>(String[] args)

letarak avatar Sep 26 '24 07:09 letarak