xml地图|网站地图|网站标签 [设为首页] [加入收藏]
实现简单的动态表达式构建查询,匿名函数
分类:编程

可以看到已经变得十分简洁,这里仅仅作为抛砖引玉,其实还有更多高级的用法,这里不再赘述。

查找指定目录下的所有文件:

 

首先去 NuGet 当中搜索 System.Linq.Dynamic.Core 库,安装之后我们来重新编写之前的查询范例,首先我们来写一个构建器,用于构建我们的表达式树:

function:用来筛选的函数,在filter中会自动的把iterable中的元素传递给function,然后根据function返回的True或者False来判断是否保留此项数据

构造函数中传入缓存大小和输出缓存顺序。
我们在调用Put方法时,当缓存长度超过我们构造函数中传入的大小时,会将队尾的移除。将新传入的对象放在队首。
我们从LRUCache中获取对象时,在Get方法中,会将对象移除,并置于队首。
下面我们来进行测试

平时使用 LINQ 进行一些简单的条件拼接查询一般都会这样操作:

注意:

private void btnTest_Click(object sender, EventArgs e)
{
LRUCache<int> lruCache = new LRUCache<int>(10);
lruCache.Put("1", 1);
lruCache.Put("2", 2);
lruCache.Put("3", 3);
lruCache.Put("4", 4);
lruCache.Put("5", 5);
        lruCache.Get("2");
        lruCache.Get("3");

        Console.WriteLine("最近最少方式Test...");
        foreach (var item in lruCache.Values)
        {
            Console.WriteLine(item.ToString());
        }

        LRUCache<int> lruCache1 = new LRUCache<int>(10, true);
        lruCache1.Put("1", 1);
        lruCache1.Put("2", 2);
        lruCache1.Put("3", 3);
        lruCache1.Put("4", 4);
        lruCache1.Put("5", 5);

        lruCache1.Get("2");
        lruCache1.Get("3");

        Console.WriteLine("顺序方式Test...");
        foreach (var item in lruCache1.Values)
        {
            Console.WriteLine(item.ToString());
        }
    }

因为我们前端传入的条件不是固定的,所以有可能会出现有的条件没有传入的情况,如果是 SQL 的动态拼接 SQL 就可以了,而 Linq 你肯定是没法动态拼接的,只有自己构建一个表达式树传入到 IQuerable<T>.Where(Expression<Func<T,bool>> expression) 里面进行查询。

Python对递归的深度有限制,超过即会报错。所以一定一要注意跳出条件。

 

public Task Search(SearchInputDto input)
{
    var queryResult = _db.Where(z=>(input.ConditionA == null || z.Name == input.ConditionA) 
                                && (input.ConditionB == null || z.Number == input.ConditionB)
                                && (input.ConditionC == null || z.Address == input.ConditionC));

    // 执行其他操作...

    return Task.FromResult(0);
}
  • 递归函数
using System;
using System.Collections.Generic;
namespace LY.Helper
{
public class LRUCache<T>
{
    private Dictionary<string, T> dict;
    private LinkedList<T> list;
    private int size = 0;
    private bool isSequence = false;

    public LRUCache(int sz):this(sz,false)
    {

    }

    public LRUCache(int sz, bool isSq)
    {
        isSequence = isSq;
        size = sz < 10 ? 10 : sz;
        dict = new Dictionary<string, T>(size);
        list = new LinkedList<T>();
    }


    public int Size
    {
        get { return size; }
        set { size = value < 10 ? 10 : value; }
    }

    public void Put(string key, T item)
    {
        T node;
        if(dict.TryGetValue(key, out node))
        {
            list.Remove(node);

            dict[key] = item;
            list.AddFirst(item);
        }
        else
        {
            if(list.Count == size)
                list.RemoveLast();
            dict[key] = item;
            list.AddFirst(item);
        }
    }

    public T Get(string key)
    {
        T node;
        if(dict.TryGetValue(key, out node))
        {
            list.Remove(node);
            list.AddFirst(node);
            return node;
        }
        return default(T);
    }

    public ICollection<T> Values
    {
        get
        {
            if (isSequence)
            {
                return dict.Values;
            }
            else
            {
                return list;
            }
        }
    }
}
}
public class SearchInputDto
{
    public string ConditionA { get; set; }
    public int? ConditionB { get; set; }
    public string ConditionC { get; set; }
}

 

图片 1图片 2

官方 WIKI 地址:

  输出为:

View Code

用法很简单,用刚才的代码作为一个例子:

<filter object at 0x000002060C6F2748>
[2, 4, 6, 8, 0]
[{'id': 3, 'name': 'wangwu', 'age': 20}, {'id': 4, 'name': 'zhaoliu', 'age': 21}]

我们来看下输出结果

本文由澳门新葡亰手机版发布于编程,转载请注明出处:实现简单的动态表达式构建查询,匿名函数

上一篇:结合造型,各类内置方法 下一篇:没有了
猜你喜欢
热门排行
精彩图文