C#进行数据筛选(二)

这里介绍LINQ+Lambda表达式进行数据筛选的方式

这里是第一种方式,还是使用了if条件语句去判断,根据选择的条件去筛选出我所需要的数据

 public GxAnaly SelectDay(string ID, DateTime Day)
        {
            try
            {
                DBEntities db = new DBEntities();
                var temp = (from pt in db.Tb_Analysis
                           where pt.ID == Sn
                           select pt).ToList();
               // return temp.Any() ? LoadFromModel(temp.First()) : null;
                if (temp.Count == 0)
                {
                    return null;
                }
                else
                {
                    List<Analy> gxDetail = new List<Analy>();
                    List<Analy> Detail = new List<Analy>();
                    temp.ForEach(e => gxDetail.Add(LoadFromModel(e)));
                    foreach (Analy Detail in gxDetail)
                    {
                        if (Detail.OtTime.Day == Day.Day&&Detail.OtTime.Month==Day.Month&&Detail.OtTime.Year==Day.Year)
                        {
                            Detail.Add(Detail);
                        }
                    }
                    if (Detail.Count == 0)
                    {
                        return null;
                    }
                    else
                    {
                        return Detail.FirstOrDefault();
                    }
                }
            }
            catch (Exception ex)
            {
                return null;
                Logger.Error(ex.Message + ex.StackTrace);
            }
        }

第二种方式,直接用Lambda自带的筛选属性

using(var db=new MyDbContext())

{

var s= db.Students.ToList().First(s=>s.ID=10086);

}

//这里写的是进行全表查询,不建议使用
//根据相应的条件进行查询,不会去查询全表,特别在数据量庞大的时候,建议加个判断using(var db=new MyDbContext())

{

var list =db.Students.AsQueryable();

if(********){list=list.Where(s=>s.ID=1200);}

if(******){list=list.Where(...)}

}

下面展示一个多个Lambda表达式进行表操作的方法

    public static class PredicateBuilder
    {

        public static Expression<Func<T, bool>> True<T>() { return f => true; }
        public static Expression<Func<T, bool>> False<T>() { return f => false; }
        public static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge)
        {
            // build parameter map (from parameters of second to parameters of first)
            var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);

            // replace parameters in the second lambda expression with parameters from the first
            var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);

            // apply composition of lambda expression bodies to parameters from the first expression
            return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
        {
            return first.Compose(second, Expression.And);
        }

完美的动态拼接Lambda表达式如下:

using (var db = new MyDbContext())
            {
                var predicate = PredicateBuilder.True<Student>();
                predicate=predicate.And(s => s.ID > 1200);
                predicate=predicate.Or(s => s.ID < 1000);
                var result = db.Students.Where(predicate).ToList();
            }

下面是一种多Lambda表达式操作的一个范例,这里部分引用来自https://blog.csdn.net/leewhoee/article/details/8968023,自己懒得去敲了,顺手就借来用了

using (var db = new SHTrackerDbContext())
            {

                var predicate = PredicateBuilder.True<Course>();
                settings = DecorateSettings(settings);

                Expression<Func<Course, bool>> checkCourse = c => db.Students.Any(s => s.CourseID == c.ID);
                if (!string.IsNullOrEmpty(settings.Quater_Year))
                {

                    checkCourse =
                        c => db.Students.Any(s => s.CourseID == c.ID && db.Student2CBOs.Any(
                            s2c => s2c.StudentID == s.ID && s2c.Quater_Year.Equals(settings.Quater_Year)));
                }
                if (settings.QuaterYearArray != null)
                {
                    checkCourse =
                        c => db.Students.Any(s => s.CourseID == c.ID && db.Student2CBOs.Any(
                            s2c =>
                            s2c.StudentID == s.ID && settings.QuaterYearArray.Any(qy => qy.Equals(s2c.Quater_Year))));
                }

                if (!string.IsNullOrEmpty(settings.DPU_ID))
                {
                    checkCourse =
                        checkCourse.And(
                            c => db.Students.Any(s => s.CourseID == c.ID && s.DPU_ID.Equals(settings.DPU_ID)));
                }
                predicate = predicate.And(checkCourse);

                if (settings.IsCheckInstructorName)
                {
                    predicate = predicate.And(c => c.InstructorName.Equals(settings.InstructorName));
                }
                if (!string.IsNullOrEmpty(settings.Term))
                {
                    predicate = predicate.And(c => c.TermDescription.Equals(settings.Term));
                }
                if (settings.TermArray != null)
                {
                    predicate = predicate.And(c => settings.TermArray.Any(t => t.Equals(c.TermDescription)));
                }
                if (settings.CourseType != CourseType.All)
                {
                    predicate = predicate.And(c => c.Type == (int) settings.CourseType);
                }
                var cc =
                    new CourseCollection(
                        db.Courses.AsNoTracking()
                          .Where(predicate)
                          .OrderByDescending(m => m.ID)
                          .Skip((pageIndex - 1)*pageSize)
                          .Take(pageSize)
                          .ToList(),
                        db.Courses.AsNoTracking().Where(predicate).Count())
                        {
                            PageIndex = pageIndex,
                            PageSize = pageSize,
                            Settings = DecorateSettings(settings)
                        };

                return cc;
            }

原文地址:https://www.cnblogs.com/yinxuejunfeng/p/9095878.html

时间: 2024-10-12 10:38:18

C#进行数据筛选(二)的相关文章

LINQ to Object初体验(使用对象取代二维数组作数据筛选)

VS2008里面有个神奇的东西,称之为LINQ,可以透过相同的语法方式来处理各式各样的数据(SQL,XML,Object,...),小喵此次初体验感受一下这个东西,真的很好用,初体验来做个简单的测试,请看小喵娓娓道来 VS2008里面有个神奇的东西,称之为LINQ,可以透过相同的语法方式来处理各式各样的数据(SQL,XML,Object,...),小喵此次初体验感受一下这个东西,真的很好用,初体验来做个简单的测试,请看小喵娓娓道来 先来看一张LINQ的架构图(数据来源:曹祖圣老师在TechEd2

jQuery 节点操作 筛选二

节点操作 $(content).method( target ) $(content).method( target ) 操作 before() insertBefore() 在目标元素前面插入内容 after() insertAfter() 在目标元素后面插入内容 append() appendTo() 在目标元素开始处插入内容 prepend() preppendTo() 在目标元素结尾处插入内容 replaceWidth() replaceAll() 在目标元素替换为内容 clone()克

excel3——数据筛选

元数据 数据--筛选---自动筛选---输入条件和数值

Android用surface直接显示yuv数据(二)

上一篇文章主要是参照AwesomePlayer直接用SoftwareRenderer类来显示yuv,为了能用到这个类,不惜依赖了libstagefright.libstagefright_color_conversion等动态静态库,从而造成程序具有很高的耦合度,也不便于我们理解yuv数据直接显示的深层次原因. 于是我开始研究SoftwareRenderer的具体实现,我们来提取SoftwareRenderer的核心代码,自己来实现yuv的显示. SoftwareRenderer就只有三个方法,

关于数据筛选的不打不小的问题

问题如下: 假设这样一种情况,首先说明,信息是存放在mysql数据库中的.情况如下,A表信息堆是百万级信息堆(每条信息长度不长,基本在20字符以内,属于简短词语),B则是一条普通信息(长度大概在500字符左右),问,有哪种最有效的方式可以来判断B信息中是否包含有A堆中的信息并返回包含的信息? 在此提供一种解法,如果大家有更好的解法欢迎大家留言交流! 由于A信息堆数据量比较大并存放于数据库中,故产生一个很简单的解法,直接通过一条sql解决,当然,这样会衍生一个问题就是sql优化,如何减少搜索时间就

DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样

'近日有本论坛网友问:DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样 '今晚正好闲着没事,加之以前也没用到过这个需求,所以就写了个模拟功能,供各位坛友酌情参考. 'VB.NET 2008 环境 '新建一个项目后,只需在Form1中拉一个DataGridView,一个ComboBox,然后将下面代码复制粘贴即可,其它什么也不用做 Public Class Form1 Dim SelectedCol As Integer = 0, IsFindit As Boo

从txt文件中读取数据放在二维数组中

1.我D盘中的test.txt文件内的内容是这样的,也是随机产生的二维数组 /test.txt/ 5.440000 3.4500006.610000 6.0400008.900000 3.0300000.140000 2.7400008.920000 7.2900002.580000 7.4300001.850000 6.1300001.350000 4.280000 ... ... 2.在我的test.cpp中添加头文件,即可使用FILE类来读取txt文件中的数据 #include <stdi

PHP数据学习-二维数组【3】

<?php // $project = array( // array("bai",12,23.0), // array("zeng",34,12.0), // array("fei",44,11.0) // ); // for($i = 0; $i < count($project); $i++){ // for($j = 0; $j<count($project[$i]); $j++){ // echo $project[$

蔡先生论道大数据之二 , 国外互联网公司的大数据应用

第一章我阐述了大数据的前世今生,今天我们来看看国外大公司如何利用和布局大数据的. IBM IBM是商业分析和大数据技术的最活跃厂商之一.早在大数据概念进入媒体视野之前,IBM就提出"智慧地球"的说法,其核心是把"智慧"嵌入系统和流程之中,使服务的交付.产品开发.制造.采购和销售得以实现,使亿万人生活和工作的方式变得更加智慧.现在,大数据技术为IBM提供了一种实现途径.近年来,IBM先后投资了SPSS.Clarity.penPages.i2.Algorithmics等