Table of Contents

逻辑查询简介

  • 基于Logic的实现类AndLogic、OrLogic、ComplexAndLogic及ComplexOrLogic等
  • AndLogic实现AND连接逻辑
  • OrLogic实现OR连接逻辑
  • ComplexAndLogic实现AND连接并支持嵌套OR查询
  • ComplexOrLogic实现OR连接并支持嵌套AND查询
  • 按And、Or来操作

1. 接口

IDataQuery

2. 方法

2.1 And扩展方法

Query And<Query>(this Query query, AtomicLogic logic)
	where Query : FilterBase, IDataQuery;
Query And<Query>(this Query query, AndLogic logic)
	where Query : FilterBase, IDataQuery;
Query And<Query>(this Query query, ComplexAndLogic logic)
	where Query : FilterBase, IDataQuery;
Query And<Query>(this Query query, OrLogic logic)
	where Query : FilterBase, IDataQuery;
Query And<Query>(this Query query, ComplexOrLogic logic)
	where Query : FilterBase, IDataQuery;
Query And<Query>(this Query query, Logic logic)
	where Query : FilterBase, IDataQuery;
Query And<Query>(this Query query, Func<ITableView, AtomicLogic> logic)
	where Query : FilterBase, IDataQuery;
Query And<Query>(this Query query, Func<ITableView, OrLogic> logic)
	where Query : FilterBase, IDataQuery
var users = new UserTable();
var query = new TableQuery(users)
     .And(users.Id.LessValue(100));
// SELECT * FROM [Users] WHERE [Id]<100
var users = new UserTable();
AndLogic andLogic = users.Id.Equal() & users.Status.Equal("Status");
var query = new TableQuery(users)
    .And(andLogic);
// SELECT * FROM [Users] WHERE [Id]=@Id AND [Status]=@Status

2.2 Or扩展方法

如果主要是OR查询,构造函数可以传一个空的Or查询对象来提高性能

Query Or<Query>(this Query query, AtomicLogic logic)
    where Query : FilterBase, IDataQuery;
Query Or<Query>(this Query query, AndLogic logic)
    where Query : FilterBase, IDataQuery;
Query Or<Query>(this Query query, ComplexAndLogic logic)
    where Query : FilterBase, IDataQuery;
Query Or<Query>(this Query query, OrLogic logic)
    where Query : FilterBase, IDataQuery;
Query Or<Query>(this Query query, ComplexOrLogic logic)
    where Query : FilterBase, IDataQuery;
Query Or<Query>(this Query query, Logic logic)
    where Query : FilterBase, IDataQuery;
Query Or<Query>(this Query query, Func<ITableView, AtomicLogic> logic)
    where Query : FilterBase, IDataQuery;
Query Or<Query>(this Query query, Func<ITableView, AndLogic> logic)
    where Query : FilterBase, IDataQuery;
var users = new UserTable();
var query = new TableQuery("Users", new OrLogic())
     .Or(users.Id.Equal())
     .Or(users.Status.Equal("Status"));
// SELECT * FROM [Users] WHERE [Id]=@Id OR [Status]=@Status
var users = new UserTable();
var query = new TableQuery(users, new OrLogic())
    .Or(users.Id.LessValue(100) | users.Status.EqualValue(true));
// SELECT * FROM [Users] WHERE [Id]<100 OR [Status]=1

2.3 Apply扩展方法

  • 操作Logic的高阶函数
  • 也可称开窗函数,把Query内部成员ITableView和Logic开放给用户直接使用
  • 以便于使用更直接、通用的逻辑来查询
  • 查询子函数标记static性能更好
Query Apply<Query>(this Query query, Func<Logic, Logic> logic)
    where Query : FilterBase, IDataQuery
Query Apply<Query>(this Query query, Func<ITableView, Logic, Logic> logic)
    where Query : FilterBase, IDataQuery;
var query = new TableQuery("Users")
    .Apply(static (u, q) => q
        .And(u.Field("Id").Equal())
        .And(u.Field("Status").EqualValue(true))
    );
// SELECT * FROM [Users] WHERE [Id]=@Id AND [Status]=1