sinxsoft

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

Linq to oracle 太变态:Contains等函数要反着写:

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

posted on   sinxsoft  阅读(2541)  评论(5编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示