SqlSugar/SqlSugar/ExpressionsToSql/ExpressionContext.cs
sunkaixuan 40f93b2109 -
2017-04-09 14:39:08 +08:00

173 lines
6.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.SqlClient;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
namespace SqlSugar
{
///<summary>
/// ** descriptionExpression to sql
/// ** authorsunkaixuan
/// ** date2017/1/14
/// ** qq:610262374
public class ExpressionContext : ExpResolveAccessory
{
#region properties
public IDbMethods DbMehtods { get; set; }
public int Index { get; set; }
public int ParameterIndex { get; set; }
public MappingColumnList MappingColumns { get; set; }
public MappingTableList MappingTables { get; set; }
public IgnoreComumnList IgnoreComumnList { get; set; }
public List<JoinQueryInfo> JoinQueryInfos { get; set; }
public bool IsJoin
{
get
{
return JoinQueryInfos.IsValuable();
}
}
public ResolveExpressType ResolveType { get; set; }
public Expression Expression { get; set; }
public ExpressionResult Result
{
get
{
if (base._Result == null)
{
this.Result = new ExpressionResult(this.ResolveType);
}
return base._Result;
}
set
{
this._Result = value;
}
}
public List<SugarParameter> Parameters
{
get
{
if (base._Parameters == null)
base._Parameters = new List<SugarParameter>();
return base._Parameters;
}
set
{
base._Parameters = value;
}
}
public virtual string SqlParameterKeyWord
{
get
{
return "@";
}
}
#endregion
#region public functions
public virtual string GetTranslationTableName(string name, bool isMapping = true)
{
Check.ArgumentNullException(name, string.Format(ErrorMessage.ObjNotExist, "Table Name Or Column Name"));
if (IsTranslationText(name)) return name;
if (isMapping && this.MappingTables.IsValuable())
{
if (name.Contains("."))
{
var columnInfo = name.Split('.');
var mappingInfo = this.MappingTables.FirstOrDefault(it => it.EntityName.Equals(columnInfo.Last(), StringComparison.CurrentCultureIgnoreCase));
if (mappingInfo != null)
{
columnInfo[columnInfo.Length - 1] = mappingInfo.EntityName;
}
return string.Join(".", columnInfo.Select(it => GetTranslationText(it)));
}
else
{
var mappingInfo = this.MappingTables.FirstOrDefault(it => it.EntityName.Equals(name, StringComparison.CurrentCultureIgnoreCase));
return "[" + (mappingInfo == null ? name : mappingInfo.EntityName) + "]";
}
}
else
{
if (name.Contains("."))
{
return string.Join(".", name.Split('.').Select(it => GetTranslationText(it)));
}
else
{
return GetTranslationText(name);
}
}
}
public virtual string GetTranslationColumnName(string name, bool isMapping = true)
{
Check.ArgumentNullException(name, string.Format(ErrorMessage.ObjNotExist, "Table Name Or Column Name"));
if (IsTranslationText(name)) return name;
if (isMapping && this.MappingColumns.IsValuable())
{
if (name.Contains("."))
{
var columnInfo = name.Split('.');
var mappingInfo = this.MappingColumns.FirstOrDefault(it => it.EntityPropertyName.Equals(columnInfo.Last(), StringComparison.CurrentCultureIgnoreCase));
if (mappingInfo != null)
{
columnInfo[columnInfo.Length - 1] = mappingInfo.DbColumnName;
}
return string.Join(".", columnInfo.Select(it => GetTranslationText(it)));
}
else
{
var mappingInfo = this.MappingColumns.FirstOrDefault(it => it.EntityPropertyName.Equals(name, StringComparison.CurrentCultureIgnoreCase));
return "[" + (mappingInfo == null ? name : mappingInfo.DbColumnName) + "]";
}
}
else
{
if (name.Contains("."))
{
return string.Join(".", name.Split('.').Select(it => GetTranslationText(it)));
}
else
{
return GetTranslationText(name);
}
}
}
public virtual bool IsTranslationText(string name)
{
return name.Contains("[") && name.Contains("]");
}
public virtual string GetTranslationText(string name)
{
return "[" + name + "]";
}
public virtual void Resolve(Expression expression, ResolveExpressType resolveType)
{
this.ResolveType = resolveType;
this.Expression = expression;
BaseResolve resolve = new BaseResolve(new ExpressionParameter() { Expression = this.Expression, Context = this });
resolve.Start();
}
public virtual string GetAsString(string asName, string fieldValue)
{
return string.Format(" {0} {1} {2} ", GetTranslationTableName(fieldValue), "AS", GetTranslationColumnName(asName, false));
}
public virtual string GetAsString(string asName, string fieldValue, string fieldShortName)
{
return string.Format(" {0} {1} {2} ", GetTranslationTableName(fieldShortName + "." + fieldValue), "AS", GetTranslationTableName(asName, false));
}
public virtual void Clear()
{
base._Result = null;
}
#endregion
}
}