首页 技术 正文
技术 2022年11月24日
0 收藏 834 点赞 4,245 浏览 3134 个字

这样的双where的语句应该怎么写呢:
var test=MyList.Where(a => a.Flows.Where(b => b.CurrentUser == “”)

下面我就说说这个问题,想想有几种方法。先来做一下准备工作,我们使用最简单的模型Category和Post

123456789101112131415161718192021 public class Category{    public int Id { get; set; }     public string Name { get; set; }     public virtual ICollection Posts { get; set; }} public class Post{    public int Id { get; set; }     public string Author { get; set; }     public string Title { get; set; }     public int CategoryId { get; set; }     public Category Category { get; set; }}

把上面的问题转换成这个模型解释就是:查询含有某个Author写的Post的Category。

这个问题如果直接使用SQL来写的话很简单:

123 select distinct(c.Id),c.Name from Categories cinner join Posts p on p.CategoryId=c.Idwhere p.Author=N'cj'

下面依次来看EntityFramework的四种实现方法。

第一种,使用Any

1 var list = ctx.Categories.Where(t => t.Posts.Any(s => s.Author == "cj"));

生成的SQL语句如下:

123456789 SELECT    [Extent1].[Id] AS [Id],    [Extent1].[Name] AS [Name]    FROM [dbo].[Categories] AS [Extent1]    WHERE  EXISTS (SELECT        1 AS [C1]        FROM [dbo].[Posts] AS [Extent2]        WHERE ([Extent1].[Id] = [Extent2].[CategoryId]) AND (N'cj' = [Extent2].[Author])    )

第二种,使用Select

1 var list = ctx.Posts.Where(t => t.Author == "cj").Select(t => t.Category).Distinct();

生成的SQL语句如下:

12345678910 SELECT    [Distinct1].[Id] AS [Id],    [Distinct1].[Name] AS [Name]    FROM ( SELECT DISTINCT        [Extent2].[Id] AS [Id],        [Extent2].[Name] AS [Name]        FROM  [dbo].[Posts] AS [Extent1]        INNER JOIN [dbo].[Categories] AS [Extent2] ON [Extent1].[CategoryId] = [Extent2].[Id]        WHERE N'cj' = [Extent1].[Author]    AS [Distinct1]

第三种,使用SelectMany

12345 var list = ctx.Categories.SelectMany(t => t.Posts, (category, post) => new{    category,    post}).Where(t => t.post.Author == "cj").Select(t => t.category).Distinct();

生成的SQL语句如下:

12345678910 SELECT    [Distinct1].[Id] AS [Id],    [Distinct1].[Name] AS [Name]    FROM ( SELECT DISTINCT        [Extent1].[Id] AS [Id],        [Extent1].[Name] AS [Name]        FROM  [dbo].[Categories] AS [Extent1]        INNER JOIN [dbo].[Posts] AS [Extent2] ON [Extent1].[Id] = [Extent2].[CategoryId]        WHERE N'cj' = [Extent2].[Author]    AS [Distinct1]

第四种,还是使用SelectMany

1 var list = ctx.Categories.SelectMany(t => t.Posts).Where(t => t.Author == "cj").Select(t => t.Category).Distinct();

生成的SQL语句如下:

12345678910 SELECT    [Distinct1].[Id] AS [Id],    [Distinct1].[Name] AS [Name]    FROM ( SELECT DISTINCT        [Extent1].[Id] AS [Id],        [Extent1].[Name] AS [Name]        FROM  [dbo].[Categories] AS [Extent1]        INNER JOIN [dbo].[Posts] AS [Extent2] ON ([Extent1].[Id] = [Extent2].[CategoryId]) AND ([Extent2].[CategoryId] = [Extent1].[Id])        WHERE N'cj' = [Extent2].[Author]    AS [Distinct1]

下面分别来说说这四种方法:

第一种方法Any,更符合我们的查询习惯,也就是文章开始提到的问题的查询风格,只不过里面的Where应该换成Any

第二种方法Select,生成的SQL语句,跟我们自己写的SQL语句是一样的,这种方法以Post为查询主体,好处可以看看SQL语句优化方面的知识。

第三种和第四种都是SelectMany,虽然EF的查询写法不同,但生成的SQL语句完全相同, 当然SelectMany是以Category为查询主体。关于SelectMany的用法请参考MSDN

Demo下载地址

补充(2014-5-11)

第五种方法,使用Contains

1 var list = ctx.Categories.Where(t => t.Posts.Select(s => s.Author).Contains("cj"));

生成的SQL语句如下:

123456789 SELECT    [Extent1].[Id] AS [Id],    [Extent1].[Name] AS [Name]    FROM [dbo].[Categories] AS [Extent1]    WHERE  EXISTS (SELECT        1 AS [C1]        FROM [dbo].[Posts] AS [Extent2]        WHERE ([Extent1].[Id] = [Extent2].[CategoryId]) AND (N'cj' = [Extent2].[Author])    )

这种方法和第一种方法Any生成的SQL语句是一样一样的。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,909
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,434
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,249
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,060
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,692
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,730