Linq与扩展方法
使用数据集
/// <summary>
/// 库房信息类
/// </summary>
public class Kfxx
{
/// <summary>
/// 库房代码
/// </summary>
public string kfdm { get; set; }
/// <summary>
/// 库房名称
/// </summary>
public string kfmc { get; set; }
/// <summary>
/// 使用状态:0有效 1无效
/// </summary>
public int jlzt { get; set; }
}
/// <summary>
/// 帐类信息类
/// </summary>
public class Zlxx
{
/// <summary>
/// 库房代码
/// </summary>
public string kfdm { get; set; }
/// <summary>
/// 帐类代码
/// </summary>
public string zldm { get; set; }
/// <summary>
/// 帐类名称
/// </summary>
public string zlmc { get; set; }
/// <summary>
/// 金额
/// </summary>
public decimal je { get; set; }
}
/// <summary>
/// 统计期信息类
/// </summary>
public class Tjqxx
{
/// <summary>
/// 库房代码
/// </summary>
public string kfdm { get; set; }
/// <summary>
/// 帐类代码
/// </summary>
public string zldm { get; set; }
/// <summary>
/// 统计期
/// </summary>
public string ny { get; set; }
/// <summary>
/// 开始日期
/// </summary>
public DateTime ksrq { get; set; }
/// <summary>
/// 结束日期
/// </summary>
public DateTime jsrq { get; set; }
/// <summary>
/// 记账标志 0未记账 1已记账
/// </summary>
public int jzbz { get; set; }
/// <summary>
/// 金额
/// </summary>
public decimal je { get; set; }
} /// <summary>
/// 数据定义
/// </summary>
public class DataSource
{
public static List<Kfxx> kfxx { get; private set; }
public static List<Kfxx> kfxx2 { get; private set; }
public static List<Zlxx> zlxx { get; private set; }
public static List<Tjqxx> tjqxx { get; private set; }
static DataSource()
{
kfxx = new List<Kfxx>
{
new Kfxx{kfdm="",kfmc="总务科",jlzt=},
new Kfxx{kfdm="",kfmc="设备科",jlzt=},
new Kfxx{kfdm="",kfmc="供应室",jlzt=},
new Kfxx{kfdm="",kfmc="总务科",jlzt=}
};
kfxx2 = new List<Kfxx>
{
new Kfxx{kfdm="",kfmc="Union库房",jlzt=}
};
zlxx = new List<Zlxx>
{
new Zlxx{kfdm="",zldm="",zlmc="医用材料",je=},
new Zlxx{kfdm="",zldm="",zlmc="一次性材料",je=},
new Zlxx{kfdm="",zldm="",zlmc="器械材料",je=},
new Zlxx{kfdm="",zldm="",zlmc="无统计期",je=}
};
tjqxx = new List<Tjqxx>
{
new Tjqxx{kfdm="",zldm="",ny="",ksrq=Convert.ToDateTime("2013-06-01 00:00:00"),jsrq=Convert.ToDateTime("2013-06-30 23:59:59"),jzbz=,je=},
new Tjqxx{kfdm="",zldm="",ny="",ksrq=Convert.ToDateTime("2013-07-01 00:00:00"),jsrq=Convert.ToDateTime("2013-07-31 23:59:59"),jzbz=,je=},
new Tjqxx{kfdm="",zldm="",ny="",ksrq=Convert.ToDateTime("2013-07-01 00:00:00"),jsrq=Convert.ToDateTime("2013-07-31 23:59:59"),jzbz=,je=},
new Tjqxx{kfdm="",zldm="",ny="",ksrq=Convert.ToDateTime("2013-07-01 00:00:00"),jsrq=Convert.ToDateTime("2013-07-31 23:59:59"),jzbz=,je=}
};
}
}
数据集
1.简单查询
var Query = from a in DataSource.kfxx
where a.kfdm==""
select new
{
a.kfdm,
a.kfmc
};
var Query = DataSource.kfxx.Select(p => new { p.kfdm, p.kfmc }).Where(p => p.kfdm == "");
2.distinct,first,last,skip,take,single
var Query = DataSource.kfxx.Select(p => new { p.kfdm, p.kfmc }).Distinct();
var Query = DataSource.kfxx.Select(p => new { p.kfdm, p.kfmc }).First();
var Query = DataSource.kfxx.Select(p => new { p.kfdm, p.kfmc }).Last();
var Query = DataSource.kfxx.Select(p => new { p.kfdm, p.kfmc }).Skip();
var Query = DataSource.kfxx.Select(p => new { p.kfdm, p.kfmc }).Take();
var Query = DataSource.kfxx.Where(p => p.kfdm == "").Select(p => new { p.kfdm, p.kfmc }).Single();
扩展方法
3.排序
var Query = from a in DataSource.kfxx
orderby a.kfdm descending, a.jlzt
select new
{
a.kfdm,
a.jlzt
};
var Query = DataSource.kfxx.OrderByDescending(p => p.kfdm).ThenBy(p => p.jlzt).Select(p => new { p.kfdm, p.jlzt });
4.Join
4.1 inner join
var Query = from a in DataSource.kfxx
from b in DataSource.zlxx
where a.jlzt == && a.kfdm==b.kfdm
orderby a.kfdm descending, a.jlzt
select new
{
a.kfdm,
a.kfmc,
b.zldm,
b.zlmc
};
var Query = (DataSource.zlxx.Join(DataSource.kfxx.Where(q => q.jlzt == ),
p => p.kfdm, q => q.kfdm,
(p, q) => new { q.kfdm, q.kfmc, p.zldm, p.zlmc, q.jlzt }))
.OrderByDescending(s => s.kfdm).ThenBy(s => s.jlzt)
.Select(t => new { t.kfdm, t.kfmc, t.zldm, t.zlmc });
4.2 left join
var Query = from a in DataSource.kfxx
from b in DataSource.zlxx
join c in DataSource.tjqxx on new { kfdm = b.kfdm, zldm = b.zldm } equals new { kfdm = c.kfdm, zldm = c.zldm }
into gg
from g in gg.DefaultIfEmpty()
where a.jlzt == && a.kfdm == b.kfdm && (g == null ? : g.jzbz) ==
//orderby a.kfdm descending, a.jlzt
select new
{
a.kfdm,
a.kfmc,
b.zldm,
b.zlmc,
ny = g == null ? "" : g.ny,
ksrq = g == null ? "" : g.ksrq.ToString(),
jsrq = g == null ? "" : g.jsrq.ToString()
};
var Query = (DataSource.zlxx.Join(DataSource.kfxx.Where(q => q.jlzt == ),
p => p.kfdm, q => q.kfdm,
(p, q) => new { q.kfdm, q.kfmc, p.zldm, p.zlmc }))
.GroupJoin(DataSource.tjqxx.Where(tjq=>tjq.jzbz==), zl => new { zl.kfdm, zl.zldm }, tjq => new { tjq.kfdm, tjq.zldm },
(zl, tjq) => new
{
zl = zl,
tjq = tjq
})
.SelectMany(group => group.tjq.DefaultIfEmpty(),
(group, tjq) => new
{
group.zl.kfdm,
group.zl.kfmc,
group.zl.zldm,
group.zl.zlmc,
ny = tjq == null ? "" : tjq.ny,
ksrq = tjq == null ? "" : tjq.ksrq.ToString(),
jsrq = tjq == null ? "" : tjq.jsrq.ToString()
}
);
5.聚合(count,sum,max,min,avg)
var Query = from a in DataSource.kfxx
join b in DataSource.zlxx on a.kfdm equals b.kfdm
into gg
where a.jlzt ==
from g in gg.DefaultIfEmpty()
group g by a.kfdm into gg1
where gg1.Sum(p => p == null ? : p.je)>
select new
{
kfdm = gg1.Key,
zlcount = gg1.Count(p => (p == null ? "" : p.zldm) != ""),
zje = gg1.Sum(p => p == null ? : p.je),
je_min = gg1.Min(p => p == null ? : p.je),
je_max = gg1.Max(p => p == null ? : p.je),
je_avg = gg1.Average(p => p == null ? : p.je)
};
var Query = DataSource.kfxx.Where(g => g.jlzt == ).GroupJoin(DataSource.zlxx, kf => kf.kfdm, zl => zl.kfdm,
(kf, zl) => new
{
kfdm = kf.kfdm,
zlcount = zl.DefaultIfEmpty().Count(p => (p == null ? "" : p.zldm) != ""),
zje = zl.DefaultIfEmpty().Sum(p => p == null ? : p.je),
je_min = zl.DefaultIfEmpty().Min(p => p == null ? : p.je),
je_max = zl.DefaultIfEmpty().Max(p => p == null ? : p.je),
je_avg = zl.DefaultIfEmpty().Average(p => p == null ? : p.je)
}).Where(g=>g.zje>);
6.其他
6.1 Union
var Query = DataSource.kfxx.Union(DataSource.kfxx2);
6.2 自定义聚合Aggregate
//自定义求平均为例
var Query = DataSource.kfxx.Where(g => g.jlzt == ).GroupJoin(DataSource.zlxx, kf => kf.kfdm, zl => zl.kfdm,
(kf, zl) => new
{
kfdm = kf.kfdm,
je_avg0 = zl.DefaultIfEmpty().Average(p => p == null ? : p.je),
je_avg1 = zl.DefaultIfEmpty().Aggregate(new Zlxx {je=},
(a, b) => { return new Zlxx { je = (a == null ? : a.je) + (b == null ? : b.je) }; },
c => new Zlxx { je = (c == null ? : c.je )/ (zl.DefaultIfEmpty().Count(p => (p == null ? "" : p.zldm) != "") == ? : (zl.DefaultIfEmpty().Count(p => (p == null ? "" : p.zldm) != ""))) }).je.ToString("C")
});
源代码(http://download.csdn.net/detail/lk13962517093/5692997)
小弟刚学,不正确之处请指点。
Linq与扩展方法的更多相关文章
- Linq之扩展方法
目录 写在前面 系列文章 扩展方法 总结 写在前面 上篇文章介绍了隐式类型,自动属性,初始化器,匿名类的相关概念,及通过反编译的方式查看了编译器帮我们做了那些事.本篇文章将介绍扩展方法的知识点,及如何 ...
- EF下lambda与linq查询&&扩展方法
1. linq查询数据 WebTestDBEntities db = new WebTestDBEntities(); 1.1 linq查询所有列数据 var userInfoList = from ...
- 21扩展IEnumerable<T>泛型接口自定义LINQ的扩展方法
LINQ方法实际上是对IEnumerable<TSource>的扩展,如图: 本篇自定义一个MyWhere方法,达到与Where相同的效果. 使用LINQ自带的Where方法 ...
- linq和扩展方法
c#的扩展方法 1.必须是在一个非嵌套.非泛型的静态类中的静态方法 2.至少一个参数,第一个参数附加this,不能有其他修饰符如out.ref 3.第一个参数不能是指针类型 上面例子是自定义的一个扩展 ...
- [转][C#]Linq 的扩展方法
public static class LinqEx { public static IEnumerable<TResult> LeftExcludingJoin<TSource, ...
- linq本质扩展方法+lambda表达式
string[] names = { "aa","bb","cc","dd"}; /* IEnumerable<s ...
- 从扩展方法到匿名方法再到LINQ
1.首先我们应该知道什么是扩展方法: 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样 ...
- ASP.NET MVC学前篇之扩展方法、链式编程
ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...
- .net学习之新语法学习(匿名类和匿名方法,扩展方法,系统内置委托,Lambda表达式和linq等)
1.自动属性 Auto-Implemented Properties 2.隐式类型 var var变量不能作为全局变量使用,因为不能在编译时确定类型 3.参数默认值 和 命名参数 4.对象初始化器 ...
随机推荐
- [TypeScript] Custom data structures in TypeScript with iterators
We usually think of types as something that can define a single layer of an object: with an interfac ...
- JAVA加解密 -- Base64加解密
Base64算法实现:可以将任意的字节数组数据,通过算法,生成只有(大小写英文.数字.+./)(一共64个字符)内容表示的字符串数据. private static final String str ...
- 对Socket CAN的理解(5)——【Socket CAN控制器的初始化过程】
转载请注明出处:http://blog.csdn.net/Righthek 谢谢! 对于一般的CAN模块,进行初始化时,最关键的是下面两步: 1. 配置CAN的位时序: 2. 配置CAN的消息报文 ...
- 右键添加在siblime中打开选项
siblime text安装完成之后没有右键打开的快捷方式,对于开发者来说每次用siblime打开文件比较繁琐. 下面教程可以让大家解决这个问题 首先点击开始--运行,输入regedit,(win7系 ...
- JSON字符串化
1.JSON字符串化 JSON字符串化有2个可选参数,分别是replacer和space. 第一个可选参数replacer,它可以是数组或者函数.用来指定哪些属性被处理,哪些属性被排除. 第二个可选参 ...
- (五)EasyUI使用——datagrid数据表格
DataGrid以表格形式展示数据,并提供了丰富的选择.排序.分组和编辑数据的功能支持.DataGrid的设计用于缩短开发时间,并且使开发人员不需要具备特定的知识.它是轻量级的且功能丰富.单元格合并. ...
- CEF与JavaScript交互读取电脑信息
CefSharp中c#和JavaScript交互读取电脑信息 介绍 CEF是由Marshall Greenblatt于2008年创建的基于Google Chromium的BSD许可开源项目.与主要关注 ...
- Atitit 文件上传 架构设计 实现机制 解决方案 实践java php c#.net js javascript c++ python
Atitit 文件上传 架构设计 实现机制 解决方案 实践java php c#.net js javascript c++ python 1. 上传的几点要求2 1.1. 本地预览2 1.2 ...
- [na]整一下博客面貌--cnblog css定制
前言 之前觉得cnblog排版乱. 而csdn对word兼容性较好一些.所以就转到csdn了. 后来看到别人的cnblog排版挺好,如 等效果. 参考资料 http://www.cnblogs.com ...
- sendmail发件人邮箱设定命令
sendmail发件人邮箱设定命令 以前就碰到过设置发件人后缀的方式,这次迁移服务器居然忘记,从头开始记录下 1:第一种方法,修改/etc/hosts,据说sendmail使用hosts里面的本地 ...