Linq to oracle 太變態:Contains等函數要反著寫:

來源:互聯網
上載者:User

上下文: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; 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.