C# 动态Linq(结合反射)

摘要:
本文决定总结最近一个独立的Web程序中使用的内容。string.IsNullOrEmpty){if{ListT=ListT.OrderByDescending.ToList();}else{ListT=ListT.OrderBy ToList()PublicclassPerson{publicPerson{Id=Id;Name=Name;Age=Age;}publicintId{get;set;}public stringName{get,set;}publicintAge{get set;}}输出如下:唯一需要注意的是初始写入不正确。事实上,排序总是对属性的值进行排序。很少使用在线系统,但最近的项目需要Web的离线版本、离线操作和在线数据导入。如果泛型和反射不被广泛使用,估计将需要大约一年的时间将Oracle写入Xml。
 

  这篇文章决定对最近一个单机版Web程序用到的东西总结一下。

一、反射Linq之OrderBy

  动态Linq结合反射对某字段排序:

复制代码
namespace 动态Linq
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Person> ListP = new List<Person>();
            ListP.Add(new Person(1, "刘备", 40));
            ListP.Add(new Person(2, "关羽", 35));
            ListP.Add(new Person(3, "张飞", 29));

            Hashtable ht = new Hashtable();
            ht.Add("SortName","Id");
            ht.Add("SortOrder","desc");

            List<Person> ListT = PageSortList<Person>(ListP, ht);
            foreach (Person p in ListT)
            {
                Console.WriteLine(p.Id);
            }

            Console.ReadKey();
        }

        //分页排序
        public static List<T> PageSortList<T>(List<T> ListT, Hashtable ht)
        {
            string SortName = ht["SortName"].ToString();
            string SortOrder = ht["SortOrder"].ToString();
            if (!string.IsNullOrEmpty(SortName))
            {
                if (SortOrder.ToLower() == "desc")
                {
                    ListT = ListT.OrderByDescending(m => m.GetType().GetProperty(SortName).GetValue(m, null)).ToList();
                }
                else
                {
                    ListT = ListT.OrderBy(m => m.GetType().GetProperty(SortName).GetValue(m, null)).ToList();
                }
            }
            return ListT;
        }
    }

    public class Person
    {
        public Person(int id, string name, int age) { Id = id; Name = name; Age = age; }

        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }
}
复制代码

  输出如下:

  C# 动态Linq(结合反射)第3张

  唯一要注意的东西,刚开始写的不正确,实际上排序始终都是对属性的值排序。这种东西有没有用呢?

  线上系统一般很少用,但是最近项目要求做一个离线版Web,离线操作,连线导入数据。Oracle转Xml,如果不大量采用泛型与反射,估计得写一年左右。

二、反射Linq之Where

  动态Linq使用Where

复制代码
namespace 动态Linq
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Person> ListP = new List<Person>();
            ListP.Add(new Person(1, "刘备", 40));
            ListP.Add(new Person(2, "关羽", 35));
            ListP.Add(new Person(3, "张飞", 29));

            Hashtable ht = new Hashtable();
            ht.Add("Name","关羽");

            List<Person> ListT = PageSortList<Person>(ListP, ht);
            foreach (Person p in ListT)
            {
                Console.WriteLine(p.Id);
            }

            Console.ReadKey();
        }

        //分页排序
        public static List<T> PageSortList<T>(List<T> ListT, Hashtable ht)
        {
            string Key = ht.Cast<DictionaryEntry>().FirstOrDefault().Key.ToString();
            string Value = ht.Cast<DictionaryEntry>().FirstOrDefault().Value.ToString();
            ListT = ListT.Where(m => m.GetType().GetProperty(Key).GetValue(m, null).ToString() == Value).ToList();
            return ListT;
        }
    }

    public class Person
    {
        public Person(int id, string name, int age) { Id = id; Name = name; Age = age; }

        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }
}
复制代码

  输出如下:

  C# 动态Linq(结合反射)第6张

免责声明:文章转载自《C# 动态Linq(结合反射)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇apiDoc的使用bat自动打包压缩实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

EF性能优化

十年河东,十年河西,莫欺少年穷。 EF就如同那个少年,ADO.NET则是一位壮年。毕竟ADO.NET出生在EF之前,而EF所走的路属于应用ADO.NET。 也就是说:你所写的LINQ查询,最后还是要转化为ADO.NET的SQL语句,转化过程中无形降低了EF的执行效率。 但是,使用EF的一个好处就是系统便于维护,减少了系统开发时间,降低了生成成本。 OK,上...

LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别

在写LINQ语句的时候,往往会看到.AsEnumerable() 和 .AsQueryable() 。例如: string strcon = "Data Source=.\\SQLEXPRESS;Initial Catalog=Db_Example;Persist Security Info=True;User ID=sa;Password=sa"; Sq...

编程语言的发展趋势by Anders Hejlsberg

这是Anders Hejlsberg在比利时TechDays 2010所做的开场演讲。   编程语言的发展非常缓慢,期间也当然出现了一些东西,例如面向对象等等,你可能会想,那么我么这么多年的努力都到哪里去了呢?事实上这些努力没有体现在编程语言上,而是出现在框架及工具等方面了。如果你关注如今我们使用的框架,它们的体积的确有很大的增长。例如当年Turbo Pa...

linq之into子句

  在Linq表达式中,into子句可以创建一个临时标识符,使用该标识符可以存储group、join或select子句的结果。 下面实例中我们用GroupOtherQuery方法来演示group子句对结果集进行分组。 1 private void GroupOtherQuery() 2 { 3 4 L...

Linq初体验

Hello,我又回来了,懒懒的好多日没有写博客的日子。 今天给大家讲讲C#中的Linq用法。 要学会使用Linq的话就一定要理解三个前置知识(委托、泛型、Lambda); 好了,说到这里,估计学C#的很多小伙伴就蒙了。 但是这三个点非常重要,是贯穿了整个C#体系的精髓部分。 本节是专门讲讲Linq是怎么用,以及为什么这么用。 Linq一般常见的用法是结合E...

linq的decimal类型保存到数据库只保存到小数点后两位的问题

今天的一个decimal类型保存到数据的问题困扰了我很长时间,最后就是一个小小的设置问题解决······坑······深坑···· 话不多说,直接说问题,在说答案: 问题:linq当采用EF的DbContext保存decimal类型数据到数据库,默认只会保存小数点后的前2位小数,其余均置0;         例如保存1.23456789,实际存到数据库里的...