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的结果
...全文
307 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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 (Size = 7; Prec = 0; Scale = 0) [Seattle] 。。。。。。。。。。。。。。。。。。。。。。。。。。。

8,494

社区成员

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

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