If execute something like this
.Where(s => (s.Style as Style1).Field1 == "asas" || (s.Style as Style1).Field1 == "asas1" || (s.Style as Style1).Field1 == "asas2")
get sql query with 3 left join, expected 1 left join
Sample DO 5.0.7
using System;
using System.Linq;
using System.Transactions;
using Xtensive.Orm;
using Xtensive.Orm.Configuration;
class Program
{
static void Main(string[] args)
{
var dc = new DomainConfiguration("sqlserver", @"Data Source=localhost\MSSQLSERVER2016; Initial Catalog=DO40-Tests; Integrated Security=True;Connection Timeout=300;Application Name=Werp;");
dc.Sessions.Add(new SessionConfiguration("Default")
{
BatchSize = 25,
DefaultIsolationLevel = IsolationLevel.ReadCommitted,
CacheSize = 1000,
DefaultCommandTimeout = 6000,
Options =
SessionOptions.Default
| SessionOptions.NonTransactionalReads
| SessionOptions.AutoActivation
| SessionOptions.SuppressRollbackExceptions
| SessionOptions.ValidateEntityVersions,
});
dc.Types.Register(typeof(Style1));
dc.Types.Register(typeof(Style2));
dc.Types.Register(typeof(Status));
dc.UpgradeMode = DomainUpgradeMode.Recreate;
using (var domain = Domain.Build(dc))
{
using (var session = domain.OpenSession())
using (session.Activate())
using (var t = session.OpenTransaction())
{
new Status(Guid.NewGuid()) { Name = "Test" };
t.Complete();
}
using (var session = domain.OpenSession())
using (session.Activate())
using (var t = session.OpenTransaction())
{
session.Query.All<Status>()
.Where(s => (s.Style as Style1).Field1 == "asas" || (s.Style as Style1).Field1 == "asas1" || (s.Style as Style1).Field1 == "asas2")
.ToArray();
t.Complete();
}
}
}
}
[HierarchyRoot]
[Index("Name", Unique = true, Name = "Status.IX_Name")]
[Serializable]
[KeyGenerator(KeyGeneratorKind.None)]
public class Status : Entity
{
public Status(Guid id)
: base(id)
{
}
[Field]
[Key]
public Guid Id { get; }
[Field]
public string Name { get; set; }
[Field]
public string Description { get; set; }
[Field]
public StyleBase Style { get; set; }
}
[HierarchyRoot]
[Serializable]
[KeyGenerator(KeyGeneratorKind.None)]
public class StyleBase : Entity
{
public StyleBase(Guid id)
: base(id)
{
}
[Field]
[Key]
public Guid Id { get; }
[Field]
public string Name { get; set; }
[Field]
public string Description { get; set; }
}
[Serializable]
public class Style1 : StyleBase
{
public Style1(Guid id)
: base(id)
{
}
[Field]
public string Field1 { get; set; }
}
[Serializable]
public class Style2 : StyleBase
{
public Style2(Guid id)
: base(id)
{
}
[Field]
public string Field2 { get; set; }
}
Sql query
SELECT [a].[Id],
100 AS [TypeId],
[a].[Name],
[a].[Description],
[a].[Style.Id]
FROM [dbo].[Status] [a]
LEFT OUTER JOIN [dbo].[Style1] [b]
INNER JOIN [dbo].[StyleBase] [c]
ON ( [c].[Id] = [b].[Id] )
ON ( [a].[Style.Id] = [c].[Id] )
LEFT OUTER JOIN [dbo].[Style1] [d]
INNER JOIN [dbo].[StyleBase] [e]
ON ( [e].[Id] = [d].[Id] )
ON ( [a].[Style.Id] = [e].[Id] )
LEFT OUTER JOIN [dbo].[Style1] [f]
INNER JOIN [dbo].[StyleBase] [g]
ON ( [g].[Id] = [f].[Id] )
ON ( [a].[Style.Id] = [g].[Id] )
WHERE ( ( [b].[Field1] = N'asas' )
OR ( [d].[Field1] = N'asas1' )
OR ( [f].[Field1] = N'asas2' ) );
asked
Jan 16 '17 at 03:04
Anton Guschin
73●30●30●35