LinQ之崩溃的动态like

来源:互联网 发布:手机象棋软件 编辑:程序博客网 时间:2024/05/21 13:58

好久才更新一篇新的东西 这次项目做的很崩溃 LinQ从来没用过

简单的查询没有什么问题 关键是不能将SQL定义成字符串进行拼凑

问题来了

有6个条件 若其中一个不为空则作为条件 每个条件之间Or的关系

在网上查到有用LINQ开发团队提供的“动态查询库(Dynamic Query Library)”

但这需要引入文件 工程不是自己的 说的不算啊

只有别的办法了

具体实现

 

先进行表的查询

var query = from tableT in table

                   where

                   (条件)

                   select new XXBE()

                   {

                     m_Table = tableT

                   };

 

有多少需要组合的就定义多少

Expression<Func<XXBE, bool>> lambdaTrue = r => true;

Expression<Func<XXBE, bool>> lambda1;

Expression<Func<XXBE, bool>> lambda2;

.

.

.

 

if (!CheckUtil.isEmpty(strCondition1))
{
    lambda1 = r => r.tableT.Name1.Contains(strCondition1);
    var invokedExpr = Expression.Invoke(lambdaTrue, lambda1 .Parameters.Cast<Expression>());

    lambdaTrue = Expression.Lambda<Func<XXBE, bool>>(Expression.And(lambda1 .Body, invokedExpr ),
        lambda1 .Parameters);
    isHaveFlag = true;
}

 

if (!CheckUtil.isEmpty(strCondition2))
{
    lambda2 = r => r.YoyakuKihonInfo.RSVI_RSVERF.Contains(strCondition2);

    var invokedExpr = Expression.Invoke(lambdaTrue, lambda2 .Parameters.Cast<Expression>());

    if (isHaveFlag)
    {
        lambdaTrue = Expression.Lambda<Func<XXBE, bool>>(Expression.Or(lambda2 .Body, invokedExpr),
        lambda2 .Parameters);
    }
    else
    {
        lambdaTrue = Expression.Lambda<Func<XXBE, bool>>(Expression.And(lambda2 .Body, invokedExpr),
        lambda2 .Parameters);
    }

    isHaveFlag = true;
}

 

.

.

.

 

最后检索

query = query.Where(lambdaTrue);

 

实在是被逼无奈啊 如果6个条件组合判断得有多少种场合啊 还得往BE里扔数据 貌似Dynamic也用不了

要是有什么别的好办法 一定要告诉我啊