Вы можете использовать IDbCommandInterceptor
и переопределить CommandText
.
Я только что создал очень простую логику для замены псевдонима с помощью регулярного выражения.
Следующий код
var query = (from f1 in db.Foos
where f1.ParentFooId == null
join f2 in db.Foos on f1.FooId equals f2.ParentFooId
select f2).ToArray();
по умолчанию станет чем-то вроде
SELECT
[Extent1].[FooId] AS [FooId],
[Extent2].[FooId] AS [FooId1],
[Extent2].[FooName] AS [FooName],
[Extent2].[ParentFooId] AS [ParentFooId],
[Extent2].[ParentFoo_FooId] AS [ParentFoo_FooId]
FROM [dbo].[Foos] AS [Extent1]
INNER JOIN [dbo].[Foos] AS [Extent2] ON [Extent1].[FooId] = [Extent2].[ParentFooId]
WHERE [Extent1].[ParentFooId] IS NULL
go
а потом я перехватил текст команды на ReaderExcecuting
.
public void ReaderExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext)
{
var aliasLookup = new Dictionary<string, string>();
var tableLookup = new Dictionary<string, int>();
var text = command.CommandText;
// Looking something like "[dbo].[Foos] AS [Extent1]"
var pattern = @"\[dbo\]\.\[([\w\d]*)\] AS \[(Extent\d*)\]";
var matches = Regex.Matches(text, pattern);
foreach(Match m in matches)
{
if (m.Groups.Count == 3)
{
var tableName = m.Groups[1].Value;
var aliasName = m.Groups[2].Value;
var replacement = tableName;
if (tableLookup.ContainsKey(tableName)) replacement += tableLookup[tableName]++;
else tableLookup.Add(tableName, 2);
aliasLookup.Add(aliasName, replacement);
}
});
foreach(var pair in aliasLookup)
{
var oldAliasName = string.Format("[{0}]", pair.Key);
var newAliasName = string.Format("[{0}]", pair.Value);
command.CommandText = command.CommandText.Replace(oldAliasName, newAliasName);
}
}
Результат будет выглядеть так
SELECT
[Foos].[FooId] AS [FooId],
[Foos2].[FooId] AS [FooId1],
[Foos2].[FooName] AS [FooName],
[Foos2].[ParentFooId] AS [ParentFooId],
[Foos2].[ParentFoo_FooId] AS [ParentFoo_FooId]
FROM [dbo].[Foos] AS [Foos]
INNER JOIN [dbo].[Foos] AS [Foos2] ON [Foos].[FooId] = [Foos2].[ParentFooId]
WHERE [Foos].[ParentFooId] IS NULL
go
Это просто дает вам представление о том, как это сделать, логика не тестировалась для сложных запросов, и ее следует использовать только для отладки.
person
Yuliam Chandra
schedule
03.08.2014