Linq innerJoin 再 LeftJoin,Where条件相关问题

warfen 2015-09-21 09:25:40
主要代码如下(代码中GetRepository使用类似了仓储的东西,这个可以忽略, CreateQuery后即是IQueryable,类似expJM 为Expression表达式):
var repCus = ctx.GetRepository<Customer>();
var reptJm = ctx.GetRepository<CustomerJM>();
var reptCusUser = ctx.GetRepository<CustomerUser>();
var reptPartner = ctx.GetRepository<K2_Partner>();


var mainQuery = from jm in reptJm.CreateQuery().Where(expJm)
join cus in repCus.CreateQuery().Where(expCus)
on jm.Id equals cus.Id
join cusUser in reptCusUser.CreateQuery().Where(expCusUser)
on cus.Id equals cusUser.CustomerId
join partner in reptPartner.CreateQuery().Where(expPartner)
on cus.UserId equals partner.PartnerId into partnerJoin
from pj in partnerJoin.DefaultIfEmpty()

select new xxx
上面是代码,我贴一下有问题的 Expression:expPartner
Expression<Func<K2_Partner, bool>> expPartner = p => p.Deleted == false && p.AgentId == 0

生成的SQL 如下:
SELECT XXX(为简便,省略一大堆字段)
FROM [dbo].[CustomerJM] AS [Extent1]
INNER JOIN [dbo].[Customer] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]
INNER JOIN [dbo].[CustomerUser] AS [Extent3] ON [Extent2].[Id] = [Extent3].[CustomerId]
LEFT OUTER JOIN [dbo].[K2_Partner] AS [Extent4] ON (0 = [Extent4].[Deleted]) AND (1 = [Extent4].[PartnerType]) AND ([Extent2].[UserId] = [Extent4].[PartnerId]) AND ([Extent4].AgentId =0)
WHERE (0 = [Extent2].[Deleted]) AND (4 = [Extent2].[CustomerType])

想请教下:如何将 LEFT OUTER JOIN 后面的 ([Extent4].AgentId =0)放到 WHERE 条件中。因为是左链接,AgentId可能为NULL,这样的结果无法得到 AgentId =0的结果
...全文
254 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxiangqing 2015-09-29
  • 打赏
  • 举报
回复
只能放在where条件里
  • 打赏
  • 举报
回复
Expression<Func<int, bool>> exp = p => p != 0;
List<int> list = new List<int>();
var query = from i in list
            join j in list on i equals j
            where exp.Compile()(j)
            select i;
给你参考下怎么将exp 写到where条件里去,不是跟在集合的Where方法里
devmiao 2015-09-21
  • 打赏
  • 举报
回复
用DefautIfEmpty
Join操作 适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等。对各个表之间的关系,就用这些实现对多个表的操作。 说明:在Join操作中,分别为Join(Join查询), SelectMany(Select一对多选择)和GroupJoin(分组Join查询)。 该扩展方法对两个序列中键匹配的元素进行inner join操作 SelectMany 说明:我们在写查询语句时,如果被翻译成SelectMany需要满足2个条件。1:查询语句中没有join和into,2:必须出现EntitySet。在我们表关系中有一对一关系,一对多关系,多对多关系等,下面分别介绍一下。 1.一对多关系(1 to Many): var q = from c in db.Customers from o in c.Orders where c.City == "London" select o; 语句描述:Customers与Orders是一对多关系。即Orders在Customers类中以EntitySet形式出现。所以第二个 from是从c.Orders而不是db.Orders里进行筛选。这个例子在From子句中使用外键导航选择伦敦客户的所有订单。 var q = from p in db.Products where p.Supplier.Country == "USA" && p.UnitsInStock == 0 select p; 语句描述:这一句使用了p.Supplier.Country条件,间接关联了Supplier表。这个例子在Where子句中使用外键导航筛选其供应商在美国且缺货的产品。生成SQL语句为: SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID],[t0].[QuantityPerUnit],[t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder],[t0].[ReorderLevel], [t0].[Discontinued] FROM [dbo].[Products] AS [t0] LEFT OUTER JOIN [dbo].[Suppliers] AS [t1] ON [t1].[SupplierID] = [t0].[SupplierID] WHERE ([t1].[Country] = @p0) AND ([t0].[UnitsInStock] = @p1) -- @p0: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [USA] -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [0] 2.多对多关系(Many to Many): var q = from e in db.Employees from et in e.EmployeeTerritories where e.City == "Seattle" select new { e.FirstName, e.LastName, et.Territory.TerritoryDescription }; 说明:多对多关系一般会涉及三个表(如果有一个表是自关联的,那有可能只有2个表)。这一句语句涉及Employees, EmployeeTerritories, Territories三个表。它们的关系是1:M:1。Employees和Territories没有很明确的关系。 LINQ to SQL语句之Join和Order By部分代码 语句描述:这个例子在From子句中使用外键导航筛选在西雅图的雇员,同时列出其所在地区。这条生成SQL语句为: SELECT [t0].[FirstName], [t0].[LastName], [t2].[TerritoryDescription] FROM [dbo].[Employees] AS [t0] CROSS JOIN [dbo].[EmployeeTerritories] AS [t1] INNER JOIN [dbo].[Territories] AS [t2] ON [t2].[TerritoryID] = [t1].[TerritoryID] WHERE ([t0].[City] = @p0) AND ([t1].[EmployeeID] = [t0].[EmployeeID]) -- @p0: Input NVarChar (Siz
DNetORM源码 源码描述: 一、源码介绍 1、DNetORM 是一款基于.net的轻量级的、轻配置的ORM框架,核心代码只有100K大小,支持SQLSERVER、MYSQL、ORACLE数据库,DNetORM的核心思想是,将最接近原生的C#代码映射出最符合场景的sql语句,从而最大程度提升开发效率。 2、为什么要开发一款orm框架,笔者在开发的这些年里,使用了很多框架,有第三方的譬如mybatis、nhibernate、ef等等,但是它们都不符合我的开发习惯,首先我喜欢轻配置,不喜欢将大量的sql语句写在配置文件里,也不喜欢将实体映射关系写在配置文件里,所以像mybatis、nhibernate这种重配置的orm我并不喜欢,EF算是一个功能强大的框架,但是EF也有一些缺陷,过于笨重,另外EF对于mysql、oracle的支持并不友好。另外还有一些其他框架接口封装的不友好、要么写法过于繁琐、要么接口不清晰,这些因素都是促使我写一个符合我的开发场景的orm 3、DNetORM使用起来非常简单,DNetORM拒绝封装过多的方法,这会造成使用的难度,只是封装了增删改查基本常用的一些方法,所以使用起来会非常简单。 4、DNetORM对于多表的联查进行了常规的封装支持了LEFT JOININNER JOIN ,GROUP BY , ORDER BY, WHERE,对于复杂的写法,建议使用DNetORM提供的SQL查询接口,我们在开发中使用orm是为了提升开发效率,节省开发时间,这是为什么使用orm的目的,orm不是为了避免使用sql,实际开发中有很多查询语句会很复杂,如果依赖orm,首先orm即使支持的话也会写的很复杂,并不直观,以往有开发的筒子们在用linq实现相同的复杂一点的sql的时候,写个sql也就是5分钟,但是为了实现linq的写法写了半小时,还写的不正确,所以这些都是违背开发精神的。所以ORM是一个开发工具,它的出现就是为了节省开发时间、提升开发效率,使用orm可以帮你解决增删改的繁杂琐事,在查询上,orm帮你处理了大部分的单表查询,在多表的查询上,orm帮你处理简单的多表查询,帮你最快的获取数据,至于复杂的sql查询,直接使用sql查询接口。也许这种做法更加合理。 二、注意事项 1、开发环境为Visual Studio 2015,使用.net 4.0开发。

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧