当前位置:编程学习 > C#/ASP.NET >>

[已结束]CSDN论坛 第11期专家问答——LINQ开发答疑

--------------------编程问答-------------------- 前排混脸熟~~ --------------------编程问答-------------------- 支持督察,学习 --------------------编程问答-------------------- Linq专家不是某CaoMVP吗?

--------------------编程问答-------------------- lingq是个好东西 支持学习! --------------------编程问答-------------------- 爆督察菊花。。。 --------------------编程问答-------------------- 顶顶帖子
占个“彩头”的


--------------------编程问答-------------------- 支持督察,学习 --------------------编程问答-------------------- 唐唐 你收徒弟嘛。我零基础,怎么能21天精通LINQ呢,是精通的内种。 --------------------编程问答--------------------   支持督查 支持督查  不爆张照片??? --------------------编程问答-------------------- 阿萨德发生 --------------------编程问答--------------------
大家好,希望能和大家在这个帖子里共同探讨LINQ相关问题,共同学习  :)  --------------------编程问答-------------------- Tim哥nice~  --------------------编程问答-------------------- 我的linq就是和督察、wuyazhe等学的。 --------------------编程问答-------------------- linq 批量删除 DeleteAllOnSubmit性能如何 --------------------编程问答--------------------

linq是个好东西啊
--------------------编程问答--------------------
引用 4 楼 xming4321 的回复:
lingq是个好东西 支持学习!

你确定是lingq,而不是linq? --------------------编程问答-------------------- 我先出个问题:LINQ怎么读? --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
引用 17 楼 caozhy 的回复:
我先出个问题:LINQ怎么读?

我个人一般这么读:灵Q~ --------------------编程问答--------------------
引用 20 楼 q107770540 的回复:
Quote: 引用 17 楼 caozhy 的回复:

我先出个问题:LINQ怎么读?

我个人一般这么读:灵Q~


我也这么读,谢谢糖糖~~ --------------------编程问答-------------------- 多数读link,灵Q也可以,读得人少 --------------------编程问答--------------------
引用 22 楼 jshi123 的回复:
多数读link,灵Q也可以,读得人少

我以前读line que,是不是很傻。 --------------------编程问答-------------------- --------------------编程问答-------------------- 督查,如何提高linq的可读性?我看几个月前自己写的linq,虽然简洁美观,但需要重新整理逻辑来推断意图,不如不用linq的代码可读性强。有什么办法能让代码又优美,又易读懂? --------------------编程问答-------------------- 我也这么读aaa --------------------编程问答--------------------
引用 25 楼 wuyazhe 的回复:
督查,如何提高linq的可读性?我看几个月前自己写的linq,虽然简洁美观,但需要重新整理逻辑来推断意图,不如不用linq的代码可读性强。有什么办法能让代码又优美,又易读懂?


个人做法,简单的查询用lamda表达式

复杂逻辑的查询,用标准表达式

多处用到的,封闭成扩展方法 --------------------编程问答-------------------- 封闭  ==》封装 --------------------编程问答-------------------- 来捧个场 --------------------编程问答-------------------- 围观斑竹解衣
--------------------编程问答-------------------- 路过,来给大猫捧场! --------------------编程问答-------------------- 版主上次帮我解决了个table筛选并构的问题,厉害啊,特来顶贴 --------------------编程问答-------------------- 路过给野猫捧场。求LINQ EF 教程。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 可以挣积分,这样要6个字 --------------------编程问答-------------------- learning --------------------编程问答-------------------- 过来捧场,LINQ确实很方便很强大。

可惜Java方面好像没有这个功能。 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 20 楼 q107770540 的回复:
Quote: 引用 17 楼 caozhy 的回复:

我先出个问题:LINQ怎么读?

我个人一般这么读:灵Q~

最后那个Q应该是读K(LINK),微软搞LINQ的也是这么读的。
http://en.wikipedia.org/wiki/Language_Integrated_Query --------------------编程问答-------------------- linq学好是大有前途。 --------------------编程问答-------------------- 正在收集问题,准备难倒专家 --------------------编程问答-------------------- 有教程吗,求教程 --------------------编程问答--------------------
引用 43 楼 googedit 的回复:
有教程吗,求教程


引用 33 楼 kongwei521 的回复:
路过给野猫捧场。求LINQ EF 教程。


教程方面推荐我之前发的LINQ IN ACTION,包含电子书+代码  和一些工具
http://bbs.csdn.net/topics/350155820
--------------------编程问答-------------------- 来捧捧场! --------------------编程问答-------------------- 每天都来给糖糖同学顶一顶。 --------------------编程问答-------------------- 2010年的时候曾经使用过linq,感觉资料很少,就没有怎么深入学习。

现在 ,看见很多人用拉姆达表达式什么的,都不懂


原来还有linq板块的。
随便说一句,我 一般都读成 林抠 --------------------编程问答-------------------- --------------------编程问答-------------------- linq怎么速成   --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 还有《程序员》杂志领噢~~ --------------------编程问答-------------------- LINQPAD (有自动提示功能)
win8下无法启动 --------------------编程问答--------------------
引用 52 楼 wuyazhe 的回复:
LINQPAD (有自动提示功能)
win8下无法启动

WIN8 有没有enable .net3.5?
我在我自己的笔记本上试过(安装win8),启动毫无压力啊 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 16 楼 yangball 的回复:
Quote: 引用 4 楼 xming4321 的回复:

lingq是个好东西 支持学习!

你确定是lingq,而不是linq?
打错字 不好意思
linq --------------------编程问答--------------------
引用 52 楼 wuyazhe 的回复:
LINQPAD (有自动提示功能)
win8下无法启动


这玩意好用么? --------------------编程问答-------------------- 来看看了 --------------------编程问答-------------------- linq跟数据库有什么关系? 好像也是select,delete语句 --------------------编程问答-------------------- learning --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 能提供一个系统的学习LINQ TO SQL的方法吗?
另外我听说LINQ TO SQL微软应该是已经不支持了,推荐我们用entity --------------------编程问答--------------------
引用 27 楼 q107770540 的回复:
Quote: 引用 25 楼 wuyazhe 的回复:

督查,如何提高linq的可读性?我看几个月前自己写的linq,虽然简洁美观,但需要重新整理逻辑来推断意图,不如不用linq的代码可读性强。有什么办法能让代码又优美,又易读懂?


个人做法,简单的查询用lamda表达式

复杂逻辑的查询,用标准表达式

多处用到的,封闭成扩展方法

请教下,能不能这3种情况,给个简单的例子说明,加深印象。 --------------------编程问答--------------------
引用 62 楼 oreoconansisu 的回复:
Quote: 引用 27 楼 q107770540 的回复:

Quote: 引用 25 楼 wuyazhe 的回复:

督查,如何提高linq的可读性?我看几个月前自己写的linq,虽然简洁美观,但需要重新整理逻辑来推断意图,不如不用linq的代码可读性强。有什么办法能让代码又优美,又易读懂?


个人做法,简单的查询用lamda表达式

复杂逻辑的查询,用标准表达式

多处用到的,封闭成扩展方法

请教下,能不能这3种情况,给个简单的例子说明,加深印象。


一般情况下,单表操作,比如WHERE,GROUPBY,ORDERBY 等 操作,用lamda表达式

多表的JOIN查询,如LEFT OUT JOIN,INNER JOIN等,用标准表达式 --------------------编程问答-------------------- 写个教程教一下如何实现自己的LinqToXXX,例如Linq To Oracle,Linq To Weibo等等等。 --------------------编程问答-------------------- 看来通信信息要时时看哟,不然都不知道啦、、、呵呵 --------------------编程问答-------------------- 混个脸瘦 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 好贴一定要顶一下。 --------------------编程问答-------------------- 问一个项目开发比较关键的问题,
linq的表达式,可以做到动态生成吗?
比如:动态组装where条件吗?
--------------------编程问答--------------------
引用 70 楼 shencb 的回复:
问一个项目开发比较关键的问题,
linq的表达式,可以做到动态生成吗?
比如:动态组装where条件吗?

当然可以了  表达式树

http://www.cnblogs.com/FlyEdward/tag/Linq%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%A0%91%20linq%20%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%A0%91/ --------------------编程问答-------------------- 占位学习!!! --------------------编程问答-------------------- 爆督察菊花。。。  --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 61 楼 BATTLERxANGE 的回复:
能提供一个系统的学习LINQ TO SQL的方法吗?
另外我听说LINQ TO SQL微软应该是已经不支持了,推荐我们用entity

同问 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 63 楼 q107770540 的回复:
Quote: 引用 62 楼 oreoconansisu 的回复:

Quote: 引用 27 楼 q107770540 的回复:

Quote: 引用 25 楼 wuyazhe 的回复:

督查,如何提高linq的可读性?我看几个月前自己写的linq,虽然简洁美观,但需要重新整理逻辑来推断意图,不如不用linq的代码可读性强。有什么办法能让代码又优美,又易读懂?


个人做法,简单的查询用lamda表达式

复杂逻辑的查询,用标准表达式

多处用到的,封闭成扩展方法

请教下,能不能这3种情况,给个简单的例子说明,加深印象。


一般情况下,单表操作,比如WHERE,GROUPBY,ORDERBY 等 操作,用lamda表达式

多表的JOIN查询,如LEFT OUT JOIN,INNER JOIN等,用标准表达式

新手提问:标准表达式指什么? --------------------编程问答-------------------- --------------------编程问答--------------------
引用 77 楼 sodisla 的回复:
Quote: 引用 63 楼 q107770540 的回复:

Quote: 引用 62 楼 oreoconansisu 的回复:

Quote: 引用 27 楼 q107770540 的回复:

Quote: 引用 25 楼 wuyazhe 的回复:

督查,如何提高linq的可读性?我看几个月前自己写的linq,虽然简洁美观,但需要重新整理逻辑来推断意图,不如不用linq的代码可读性强。有什么办法能让代码又优美,又易读懂?


个人做法,简单的查询用lamda表达式

复杂逻辑的查询,用标准表达式

多处用到的,封闭成扩展方法

请教下,能不能这3种情况,给个简单的例子说明,加深印象。


一般情况下,单表操作,比如WHERE,GROUPBY,ORDERBY 等 操作,用lamda表达式

多表的JOIN查询,如LEFT OUT JOIN,INNER JOIN等,用标准表达式

新手提问:标准表达式指什么?

比如:
lamda表达式:
  var query=db.Users.Where(u=>u.Name.Contains("Tim"));


标准表达式:
 var query=from u in db.Users 
                     where u.Name.Contains("Tim")
                     select u;
--------------------编程问答-------------------- linq 确实强大和好用,由于在工作中使用不多,自己只有私下才会用下,请问版主三个问题
一、linq to sql 在效率上、速度上跟传统的sql语句(数据汇总类的sql语句,有点复杂度的那种Sql统计语句 ),有没有优势,或者那种更占优势点
二、linq 是否支持对 sql 存储过程的操作
三、linq to sql 对大量数据的分页,能否给点示例 --------------------编程问答-------------------- --------------------编程问答-------------------- 支持C#,支持LZ! --------------------编程问答-------------------- --------------------编程问答-------------------- linq to object ,linq to sql
众所周知,LINQ的使用都是建立在强类型化集合的基础之上,也可以把这些类型统称为Object。(如List<T>中的T)那如此一来LINQ2SQL也便脱离不了linq to object的影子了。而现在都划分出linq to object ,linq to sql,请问这2点的明确边界线在哪里?究竟是如何划分的?我们能不能说LINQ2SQL就是linq to object?还有LINQ2SQL在4.0中就不被支持了。取而代之的是EF这一套。那么能不能理解EF就是LINQ2SQL的升级版(EF是支持多类型数据库,相比SQL是进步了),还是有其他的区别?还有EF目前广泛使用到了仓储,注入式。这些机制的优势在哪里?为什么要使用这些?问题比较多啊。好不容易遇到专家。。。希望专家见谅啊。。我们都盼着你很长时间了。呵呵~ --------------------编程问答-------------------- 1,linq to object ,linq to sql
众所周知,LINQ的使用都是建立在强类型化集合的基础之上,也可以把这些类型统称为Object。(如List<T>中的T)那如此一来LINQ2SQL也便脱离不了linq to object的影子了。而现在都划分出linq to object ,linq to sql,请问这2点的明确边界线在哪里?究竟是如何划分的?我们能不能说LINQ2SQL就是linq to object?

2,还有LINQ2SQL在4.0中就不被扩展了。取而代之的是EF这一套。那么能不能理解EF就是LINQ2SQL的升级版(EF是支持多类型数据库,相比SQL是进步了),还是有其他的区别?还有EF目前广泛使用到了仓储,注入式。这些机制的优势在哪里?为什么要使用这些?


问题比较多啊。好不容易遇到专家。。。希望专家见谅啊。。我们都盼着你很长时间了。呵呵~  --------------------编程问答--------------------
引用 79 楼 q107770540 的回复:
Quote: 引用 77 楼 sodisla 的回复:

Quote: 引用 63 楼 q107770540 的回复:

Quote: 引用 62 楼 oreoconansisu 的回复:

Quote: 引用 27 楼 q107770540 的回复:

Quote: 引用 25 楼 wuyazhe 的回复:

督查,如何提高linq的可读性?我看几个月前自己写的linq,虽然简洁美观,但需要重新整理逻辑来推断意图,不如不用linq的代码可读性强。有什么办法能让代码又优美,又易读懂?


个人做法,简单的查询用lamda表达式

复杂逻辑的查询,用标准表达式

多处用到的,封闭成扩展方法

请教下,能不能这3种情况,给个简单的例子说明,加深印象。


一般情况下,单表操作,比如WHERE,GROUPBY,ORDERBY 等 操作,用lamda表达式

多表的JOIN查询,如LEFT OUT JOIN,INNER JOIN等,用标准表达式

新手提问:标准表达式指什么?

比如:
lamda表达式:
  var query=db.Users.Where(u=>u.Name.Contains("Tim"));


标准表达式:
 var query=from u in db.Users 
                     where u.Name.Contains("Tim")
                     select u;

那这两个表达式都是获取用户名中包含有Tim的,请问这两者有什么区别吗? --------------------编程问答--------------------
引用 86 楼 sodisla 的回复:
Quote: 引用 79 楼 q107770540 的回复:

Quote: 引用 77 楼 sodisla 的回复:

Quote: 引用 63 楼 q107770540 的回复:

Quote: 引用 62 楼 oreoconansisu 的回复:

Quote: 引用 27 楼 q107770540 的回复:

Quote: 引用 25 楼 wuyazhe 的回复:

督查,如何提高linq的可读性?我看几个月前自己写的linq,虽然简洁美观,但需要重新整理逻辑来推断意图,不如不用linq的代码可读性强。有什么办法能让代码又优美,又易读懂?


个人做法,简单的查询用lamda表达式

复杂逻辑的查询,用标准表达式

多处用到的,封闭成扩展方法

请教下,能不能这3种情况,给个简单的例子说明,加深印象。


一般情况下,单表操作,比如WHERE,GROUPBY,ORDERBY 等 操作,用lamda表达式

多表的JOIN查询,如LEFT OUT JOIN,INNER JOIN等,用标准表达式

新手提问:标准表达式指什么?

比如:
lamda表达式:
  var query=db.Users.Where(u=>u.Name.Contains("Tim"));


标准表达式:
 var query=from u in db.Users 
                     where u.Name.Contains("Tim")
                     select u;

那这两个表达式都是获取用户名中包含有Tim的,请问这两者有什么区别吗?


在CLR看来,二者没有什么区别。 在数据库看来,二者也没有什么区别,最终都得到相同的查询结果:

select * from Users where name like '%Tim%'
--------------------编程问答--------------------
引用 86 楼 sodisla 的回复:
Quote: 引用 79 楼 q107770540 的回复:

Quote: 引用 77 楼 sodisla 的回复:

Quote: 引用 63 楼 q107770540 的回复:

Quote: 引用 62 楼 oreoconansisu 的回复:

Quote: 引用 27 楼 q107770540 的回复:

Quote: 引用 25 楼 wuyazhe 的回复:

督查,如何提高linq的可读性?我看几个月前自己写的linq,虽然简洁美观,但需要重新整理逻辑来推断意图,不如不用linq的代码可读性强。有什么办法能让代码又优美,又易读懂?


个人做法,简单的查询用lamda表达式

复杂逻辑的查询,用标准表达式

多处用到的,封闭成扩展方法

请教下,能不能这3种情况,给个简单的例子说明,加深印象。


一般情况下,单表操作,比如WHERE,GROUPBY,ORDERBY 等 操作,用lamda表达式

多表的JOIN查询,如LEFT OUT JOIN,INNER JOIN等,用标准表达式

新手提问:标准表达式指什么?

比如:
lamda表达式:
  var query=db.Users.Where(u=>u.Name.Contains("Tim"));


标准表达式:
 var query=from u in db.Users 
                     where u.Name.Contains("Tim")
                     select u;

那这两个表达式都是获取用户名中包含有Tim的,请问这两者有什么区别吗?


Linq表达式是语法糖,C#编译器会转化成等效的Linq操作符,而且Linq表达式只能实现Linq所有功能的一个子集。Linq表达式在VB和C#中受到支持的程度还不一致。比如Distinct,在VB中支持,而C#就只能用Linq操作符了。作为初学者,要想得要领,先应该学会Linq操作符,再学习Linq表达式和Linq操作符的对应关系,这样使用Linq表达式才能运用自如。 --------------------编程问答--------------------
引用 85 楼 hengren4 的回复:

LinqToXXX和LinqToObject的不同是,前者查询的过程是由其Provider实现的,比如Linq To SQL,它是直接把你的where orderby take skip等等全部翻译成sql,在数据库上查询的。试想如果直接使用LinqToObject,后果就是如果数据库中有10万条数据,你只要name=abc的第一条数据,那也得傻呵呵地把所有的数据都搬到内存中,然后才能过滤出那一条。 --------------------编程问答-------------------- 还有EF目前广泛使用到了仓储,注入式。这些机制的优势在哪里?为什么要使用这些?
你用的名词挺多,但是这些和EF没有任何关系。如果你能在听到一个感觉很靓的名词的时候花5分钟google下,就更好了。 --------------------编程问答--------------------
引用 85 楼 hengren4 的回复:
1,linq to object ,linq to sql
众所周知,LINQ的使用都是建立在强类型化集合的基础之上,也可以把这些类型统称为Object。(如List<T>中的T)那如此一来LINQ2SQL也便脱离不了linq to object的影子了。而现在都划分出linq to object ,linq to sql,请问这2点的明确边界线在哪里?究竟是如何划分的?我们能不能说LINQ2SQL就是linq to object?

2,还有LINQ2SQL在4.0中就不被扩展了。取而代之的是EF这一套。那么能不能理解EF就是LINQ2SQL的升级版(EF是支持多类型数据库,相比SQL是进步了),还是有其他的区别?还有EF目前广泛使用到了仓储,注入式。这些机制的优势在哪里?为什么要使用这些?


问题比较多啊。好不容易遇到专家。。。希望专家见谅啊。。我们都盼着你很长时间了。呵呵~ 

1. 同意89楼老曹的意见

linq to object是直接在内存中查询

而LINQ TO SQL 有一个特性,就是延迟查询,简单点理解就是:当你要去查询数据库中某表的数据时,程序执行到查询的代码行,但是并没有去立即查询,而是当你需要使用这些数据时,LINQ才会去查询数据库,返回IQueryable<T>

2.就像你所说的,LINQ2SQL只支持SQL SERVER,EF支持多数据库,但在支持SQL SERVER没有LINQ2SQL支持的更全面。 各有千秋吧。 有些操作符在LINQ2SQL中,可以直接翻译成SQL语句,而在EF中,就不支持。详情可参考:http://msdn.microsoft.com/en-us/library/bb738550.aspx
 
仓储和注入,这些确实和EF没有什么关系,但你可以在EF中实现它们。 比如,在泛型基类中封装了DbContext对象,这样做可以完成一般性的事务处理需求 --------------------编程问答--------------------
引用 87 楼 q107770540 的回复:
Quote: 引用 86 楼 sodisla 的回复:

Quote: 引用 79 楼 q107770540 的回复:

Quote: 引用 77 楼 sodisla 的回复:

Quote: 引用 63 楼 q107770540 的回复:

Quote: 引用 62 楼 oreoconansisu 的回复:

Quote: 引用 27 楼 q107770540 的回复:

Quote: 引用 25 楼 wuyazhe 的回复:

督查,如何提高linq的可读性?我看几个月前自己写的linq,虽然简洁美观,但需要重新整理逻辑来推断意图,不如不用linq的代码可读性强。有什么办法能让代码又优美,又易读懂?


个人做法,简单的查询用lamda表达式

复杂逻辑的查询,用标准表达式

多处用到的,封闭成扩展方法

请教下,能不能这3种情况,给个简单的例子说明,加深印象。


一般情况下,单表操作,比如WHERE,GROUPBY,ORDERBY 等 操作,用lamda表达式

多表的JOIN查询,如LEFT OUT JOIN,INNER JOIN等,用标准表达式

新手提问:标准表达式指什么?

比如:
lamda表达式:
  var query=db.Users.Where(u=>u.Name.Contains("Tim"));


标准表达式:
 var query=from u in db.Users 
                     where u.Name.Contains("Tim")
                     select u;

那这两个表达式都是获取用户名中包含有Tim的,请问这两者有什么区别吗?


在CLR看来,二者没有什么区别。 在数据库看来,二者也没有什么区别,最终都得到相同的查询结果:

select * from Users where name like '%Tim%'

这样的话没什么区别,那上面的:一般情况下,单表操作,比如WHERE,GROUPBY,ORDERBY 等 操作,用lamda表达式

多表的JOIN查询,如LEFT OUT JOIN,INNER JOIN等,用标准表达式
为什么要这样分呢? --------------------编程问答-------------------- 顶之 --------------------编程问答--------------------
引用 92 楼 sodisla 的回复:
Quote: 引用 87 楼 q107770540 的回复:

Quote: 引用 86 楼 sodisla 的回复:

Quote: 引用 79 楼 q107770540 的回复:

Quote: 引用 77 楼 sodisla 的回复:

Quote: 引用 63 楼 q107770540 的回复:

Quote: 引用 62 楼 oreoconansisu 的回复:

Quote: 引用 27 楼 q107770540 的回复:

Quote: 引用 25 楼 wuyazhe 的回复:

督查,如何提高linq的可读性?我看几个月前自己写的linq,虽然简洁美观,但需要重新整理逻辑来推断意图,不如不用linq的代码可读性强。有什么办法能让代码又优美,又易读懂?


个人做法,简单的查询用lamda表达式

复杂逻辑的查询,用标准表达式

多处用到的,封闭成扩展方法

请教下,能不能这3种情况,给个简单的例子说明,加深印象。


一般情况下,单表操作,比如WHERE,GROUPBY,ORDERBY 等 操作,用lamda表达式

多表的JOIN查询,如LEFT OUT JOIN,INNER JOIN等,用标准表达式

新手提问:标准表达式指什么?

比如:
lamda表达式:
  var query=db.Users.Where(u=>u.Name.Contains("Tim"));


标准表达式:
 var query=from u in db.Users 
                     where u.Name.Contains("Tim")
                     select u;

那这两个表达式都是获取用户名中包含有Tim的,请问这两者有什么区别吗?


在CLR看来,二者没有什么区别。 在数据库看来,二者也没有什么区别,最终都得到相同的查询结果:

select * from Users where name like '%Tim%'

这样的话没什么区别,那上面的:一般情况下,单表操作,比如WHERE,GROUPBY,ORDERBY 等 操作,用lamda表达式

多表的JOIN查询,如LEFT OUT JOIN,INNER JOIN等,用标准表达式
为什么要这样分呢?


这就回到了25楼的问题了啊: 为了提高linq的可读性 --------------------编程问答-------------------- 请问哈,List<T> T表示引用类型,比如是一个类,Linq 如何去除此集合的重复数据 --------------------编程问答--------------------
引用 95 楼 binpo1 的回复:
请问哈,List<T> T表示引用类型,比如是一个类,Linq 如何去除此集合的重复数据

重新实现IEqualityComparer<T>接口,使用Enumerable.Distinct<TSource> Method (IEnumerable<TSource>, IEqualityComparer<TSource>)来去重复:
public static IEnumerable<TSource> Distinct<TSource>(
this IEnumerable<TSource> source,
IEqualityComparer<TSource> comparer
)


举例,比如目前有这样一个Product[] 需要去重复:


public class Product
{
    public string Name { get; set; }
    public int Code { get; set; }
}


Product[] products = { new Product { Name = "apple", Code = 9 }, 
                       new Product { Name = "orange", Code = 4 }, 
                       new Product { Name = "apple", Code = 9 }, 
                       new Product { Name = "lemon", Code = 12 } };



首先要自定义一个class ProductComparer : IEqualityComparer<Product>
// Custom comparer for the Product class 
class ProductComparer : IEqualityComparer<Product>
{
    // Products are equal if their names and product numbers are equal. 
    public bool Equals(Product x, Product y)
    {

        //Check whether the compared objects reference the same data. 
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether any of the compared objects is null. 
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        //Check whether the products' properties are equal. 
        return x.Code == y.Code && x.Name == y.Name;
    }

    // If Equals() returns true for a pair of objects  
    // then GetHashCode() must return the same value for these objects. 

    public int GetHashCode(Product product)
    {
        //Check whether the object is null 
        if (Object.ReferenceEquals(product, null)) return 0;

        //Get hash code for the Name field if it is not null. 
        int hashProductName = product.Name == null ? 0 : product.Name.GetHashCode();

        //Get hash code for the Code field. 
        int hashProductCode = product.Code.GetHashCode();

        //Calculate the hash code for the product. 
        return hashProductName ^ hashProductCode;
    }

}


然后进行去重复操作:
IEnumerable<Product> noduplicates =
    products.Distinct(new ProductComparer());

foreach (var product in noduplicates)
    Console.WriteLine(product.Name + " " + product.Code);

/*
    This code produces the following output:
    apple 9 
    orange 4
    lemon 12
*/
--------------------编程问答--------------------
引用 92 楼 sodisla 的回复:
Quote: 引用 87 楼 q107770540 的回复:

Quote: 引用 86 楼 sodisla 的回复:

Quote: 引用 79 楼 q107770540 的回复:

Quote: 引用 77 楼 sodisla 的回复:

Quote: 引用 63 楼 q107770540 的回复:

Quote: 引用 62 楼 oreoconansisu 的回复:

Quote: 引用 27 楼 q107770540 的回复:

Quote: 引用 25 楼 wuyazhe 的回复:

督查,如何提高linq的可读性?我看几个月前自己写的linq,虽然简洁美观,但需要重新整理逻辑来推断意图,不如不用linq的代码可读性强。有什么办法能让代码又优美,又易读懂?


个人做法,简单的查询用lamda表达式

复杂逻辑的查询,用标准表达式

多处用到的,封闭成扩展方法

请教下,能不能这3种情况,给个简单的例子说明,加深印象。


一般情况下,单表操作,比如WHERE,GROUPBY,ORDERBY 等 操作,用lamda表达式

多表的JOIN查询,如LEFT OUT JOIN,INNER JOIN等,用标准表达式

新手提问:标准表达式指什么?

比如:
lamda表达式:
  var query=db.Users.Where(u=>u.Name.Contains("Tim"));


标准表达式:
 var query=from u in db.Users 
                     where u.Name.Contains("Tim")
                     select u;

那这两个表达式都是获取用户名中包含有Tim的,请问这两者有什么区别吗?


在CLR看来,二者没有什么区别。 在数据库看来,二者也没有什么区别,最终都得到相同的查询结果:

select * from Users where name like '%Tim%'

这样的话没什么区别,那上面的:一般情况下,单表操作,比如WHERE,GROUPBY,ORDERBY 等 操作,用lamda表达式

多表的JOIN查询,如LEFT OUT JOIN,INNER JOIN等,用标准表达式
为什么要这样分呢?


很多问题自己是能够想明白的。或者说,你即便在询问别人之前,也应该自己想一想。当发现别人和自己答案不同的时候,如果别人的答案更好,你会收获思考的方法,并且进步。当你发现别人的答案不如你的,或者是你考虑过,但是否决的,你又会以质疑的眼光重新审视别人的答案,并且去伪存真。记住,这个世界上所有的问题的答案都是人想出来的。所以不要轻易放弃思考的权利。 --------------------编程问答-------------------- Good Morning --------------------编程问答--------------------
引用 96 楼 q107770540 的回复:
Quote: 引用 95 楼 binpo1 的回复:

请问哈,List<T> T表示引用类型,比如是一个类,Linq 如何去除此集合的重复数据

重新实现IEqualityComparer<T>接口,使用Enumerable.Distinct<TSource> Method (IEnumerable<TSource>, IEqualityComparer<TSource>)来去重复:
public static IEnumerable<TSource> Distinct<TSource>(
this IEnumerable<TSource> source,
IEqualityComparer<TSource> comparer
)


举例,比如目前有这样一个Product[] 需要去重复:


public class Product
{
    public string Name { get; set; }
    public int Code { get; set; }
}


Product[] products = { new Product { Name = "apple", Code = 9 }, 
                       new Product { Name = "orange", Code = 4 }, 
                       new Product { Name = "apple", Code = 9 }, 
                       new Product { Name = "lemon", Code = 12 } };



首先要自定义一个class ProductComparer : IEqualityComparer<Product>
// Custom comparer for the Product class 
class ProductComparer : IEqualityComparer<Product>
{
    // Products are equal if their names and product numbers are equal. 
    public bool Equals(Product x, Product y)
    {

        //Check whether the compared objects reference the same data. 
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether any of the compared objects is null. 
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        //Check whether the products' properties are equal. 
        return x.Code == y.Code && x.Name == y.Name;
    }

    // If Equals() returns true for a pair of objects  
    // then GetHashCode() must return the same value for these objects. 

    public int GetHashCode(Product product)
    {
        //Check whether the object is null 
        if (Object.ReferenceEquals(product, null)) return 0;

        //Get hash code for the Name field if it is not null. 
        int hashProductName = product.Name == null ? 0 : product.Name.GetHashCode();

        //Get hash code for the Code field. 
        int hashProductCode = product.Code.GetHashCode();

        //Calculate the hash code for the product. 
        return hashProductName ^ hashProductCode;
    }

}


然后进行去重复操作:
IEnumerable<Product> noduplicates =
    products.Distinct(new ProductComparer());

foreach (var product in noduplicates)
    Console.WriteLine(product.Name + " " + product.Code);

/*
    This code produces the following output:
    apple 9 
    orange 4
    lemon 12
*/
谢谢 --------------------编程问答--------------------
补充:.NET技术 ,  LINQ
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,