ORM动态表达式树查询
前言
接口获取参数后,创建返回值模型的条件表达式作为参数,传入使用依赖注入实例化后的业务层。
业务层创建返回值模型的IQUERY后,再使用参数条件表达式。最后进行延迟查询。
代码实现
参数模型DemoParaModel
public class DemoParaModel
{
/// <summary>
/// 必填参数
/// </summary>
[Required]
public string Age { get; set; }
public string Name { get; set; }
}
ORM实体Demo_Age
[Table("DEMO_AGE")]
public class Demo_Age
{
[Column("ID", IsPrimaryKey = true)]
public string ID { get; set; }
[Column("AGE")]
public string Age { get; set; }
}
ORM实体Demo_Name
[Table("DEMO_NAME")]
public class Demo_Name
{
[Column("ID", IsPrimaryKey = true)]
public string ID { get; set; }
[Column("Name")]
public string Name { get; set; }
}
返回值模型
public class View_DemoPerson
{
public string ID { get; set; }
public string Name { get; set; }
public string Age { get; set; }
}
控制器接口
构造表达式时的AND方法的实现:Linq.Expressions扩展
public class DemoController : BaseController
{
#region 服务
private IDemoService _demoService;
public DemoController(IDemoService demoService)
{
_demoService = demoService;
}
#endregion
public ActionResult Login(DemoParaModel paraModel)
{
//创建表达式
Expression<Func<View_DemoPerson, bool>> lambdaExpression = t => true;
//构造表达式
if (!string.IsNullOrWhiteSpace(paraModel.Age))
{
lambdaExpression = lambdaExpression.And(t => t.Age == paraModel.Age);
}
if (!string.IsNullOrWhiteSpace(paraModel.Name))
{
lambdaExpression = lambdaExpression.And(t => t.Name == paraModel.Name);
}
//获取视图模型数据
List<View_DemoPerson> list = _demoService.DemoDoSomeThing(lambdaExpression);
//返回数据
return JsonResult(list);
}
}
业务层接口
public interface IDemoService
{
List<View_DemoPerson> DemoDoSomeThing(Expression<Func<View_DemoPerson, bool>> lambda = null);
}
业务层接口实例
public class DemoService : ServiceBase, IDemoService
{
public List<View_DemoPerson> DemoDoSomeThing(Expression<Func<View_DemoPerson, bool>> lambda = null)
{
List<View_DemoPerson> list = new List<View_DemoPerson>();
using (DbContext)
{
//先获取业务所有涉及表的数据库实体的IQuery
IQuery<Demo_Name> query_DemoName = DbContext.Query<Demo_Name>();
IQuery<Demo_Age> query_DemoAge = DbContext.Query<Demo_Age>();
//将数据库实体的IQuery关联查询,创建出返回模型的IQuery
IQuery<View_DemoPerson> query_View_DemoPerson =
query_DemoName.LeftJoin(query_DemoAge, (x, y) => x.ID == y.ID)
.Select(
(x, y) => new View_DemoPerson
{
ID = x.ID,
Name = x.Name,
Age = y.Age
});
//对返回模型的IQuery使用传进来的条件表达式参数
query_View_DemoPerson = query_View_DemoPerson.Where(lambda);
//延迟查询
list = query_View_DemoPerson.ToList();
}
return list;
}
}