上下文:SaaSReportProContext ctx = Factory.SaaSReportProContextFactory.GetSaaSReportProContext();
有三個參數:string reportName, string module, String type
在linq to sql中
var query = from o in ctx.Reportor
where o.REPORTOR_NAME.Contains(reportName)
&& o.REPORTOR_MODULE.Contains(module)
&& o.REPORTOR_TYPE.Contains(type)
select o;
翻譯成sql
select * from xxx where REPORTOR_NAME like '%x%' .........
在linq to oracle中居然反著寫:
var query = from o in ctx.Reportor
where (String.IsNullOrEmpty(reportName) ? true : reportName.Contains(o.REPORTOR_NAME))
&& (String.IsNullOrEmpty(module) ? true : module.Contains(o.REPORTOR_MODULE))
&& (String.IsNullOrEmpty(type) ? true : type.Contains(o.REPORTOR_TYPE))
這樣的話,到時候我將oracle又換成sql server資料庫,所有的查詢代碼要重寫了,根本沒有移植可能了。
本來EFOracleProvider工程是一個比較好linq to oracle的開源工程,看來得自己下手修改實現了。
後來想了想,如果修改開源架構,導致以後開源架構更新後的更新維護問題,於是直接寫了下屬代碼來處理這個問題:
1,介面:ILikeBridge
代碼
/// <summary>
/// 定義此類主要是為瞭解決linq to oracle中的Contains(),StratWith()等函數的調用方法和linq to sql調用相反:具體:
/// 故建一座橋,所有like經過這座橋轉過去
/// 當資料庫換成sql或者別的資料庫,修改此類或者配置即可
/// </summary>
public interface ILikeBridge
{
bool LikeLeft(string field, string value);
bool LikeRight(string field, string value);
bool LikeAll(string field, string value);
}
2,ora的實現
代碼
public class LikeBridgeOra : ILikeBridge
{
public bool LikeLeft(string field, string value)
{
//oracle
return (String.IsNullOrEmpty(value) ? true : value.StartsWith(field));
}
public bool LikeRight(string field, string value)
{
//oracle
return (String.IsNullOrEmpty(value) ? true : value.EndsWith(field));
}
public bool LikeAll(string field, string value)
{
//oracle
return (String.IsNullOrEmpty(value) ? true : value.Contains(field));
}
}
3,sql的實現
代碼
public class LikeBridgeSql : ILikeBridge
{
public bool LikeLeft(string field, string value)
{
return field.StartsWith(value);
}
public bool LikeRight(string field, string value)
{
return field.EndsWith(value);
}
public bool LikeAll(string field, string value)
{
return field.Contains(value);
}
}
4,工廠
代碼
public class LikeBridgeFactory
{
private static ILikeBridge bridge = null;
public static ILikeBridge GetLikeBridge()
{
if (bridge == null)
{
object obj = Assembly.GetExecutingAssembly().CreateInstance(System.Configuration.ConfigurationManager.AppSettings["LikeBridgeProvider"]);
bridge = obj as ILikeBridge;
}
return bridge;
}
}
5,最後在X.config中加入key“LikeBridgeProvider” value = “xx.xx.LikeBridgeOra”
6,調用:
var query = from o in ctx.Reportor
where Linq.LikeBridgeFactory.GetLikeBridge().LikeAll(o.REPORTOR_NAME,reportName)
&& Linq.LikeBridgeFactory.GetLikeBridge().LikeAll(o.REPORTOR_MODULE, reportName)
&& Linq.LikeBridgeFactory.GetLikeBridge().LikeAll(o.REPORTOR_TYPE, type)
select o;