问一下这种linq怎么写

-一个大坑 2019-02-19 11:54:48
a是主表,b是为了让a表和c表有对应关系,如果a表的PaymentCode 有值时,a表、b表、c表联合查询,如果a表的PaymentCode 为空时,就不用和c表联合查询,AgentName ,ChannelCategory 为string.Empty就行

(from a in _service.GetList()
join b in _DlrPaymentService.GetList() on a.PaymentCode equals b.PaymentCode
into paymentCode
from payment in paymentCode.DefaultIfEmpty()
join c in _DlrBdAgentService.GetList() on payment.AgentName equals c.AgentName
into agentName
from agent in agentName.DefaultIfEmpty()
select new DLRRP04Model
{
Emplid = a.Emplid,
Deptid = a.Deptid,
Cname = a.Cname,
Pstatus = a.Pstatus == null ? string.Empty : EnumExtension.GetDescription((InterviewStatus)((int)a.Pstatus)),
AgentName = agent == null ? string.Empty : agent.AgentShortName,
ChannelCategory = payment==null?string.Empty:payment.ChannelCategory
})

我现在写的PaymentCode 为空时查询会报错"Object reference not set to an instance of an object."
...全文
189 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2019-02-19
  • 打赏
  • 举报
回复
出于可读性的考虑,应该分2个linq来写,用if判断
-一个大坑 2019-02-19
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
出于可读性的考虑,应该分2个linq来写,用if判断

这样吗?感觉写的有点长

var dlrRP04List1 = (from a in _service.GetList(o => o.PaymentCode == null)
join b in _DlrPaymentService.GetList() on a.PaymentCode equals b.PaymentCode
into paymentCode
from payment in paymentCode.DefaultIfEmpty()
select new DLRRP04Model
{
Emplid = a.Emplid,
Plant = a.Plant,
Deptid = a.Deptid,
Cname = a.Cname,
Sex = a.Sex,
Nation = a.Nation,
Identitycard = a.Identitycard,
InterviewDate = a.InterviewDate,
Hdate = a.Hdate,
PredeliverDate = a.PredeliverDate,
Pstatus = a.Pstatus == null ? string.Empty : EnumExtension.GetDescription((InterviewStatus)((int)a.Pstatus)),
AgentName = string.Empty,
ChannelCategory = payment == null ? string.Empty : payment.ChannelCategory
});

var dlrRP04List2 = (from a in _service.GetList(o => o.PaymentCode != null)
join b in _DlrPaymentService.GetList() on a.PaymentCode equals b.PaymentCode
into paymentCode
from payment in paymentCode.DefaultIfEmpty()
join c in _DlrBdAgentService.GetList() on payment.AgentName equals c.AgentName
into agentName
from agent in agentName.DefaultIfEmpty()
select new DLRRP04Model
{
Emplid = a.Emplid,
Plant = a.Plant,
Deptid = a.Deptid,
Cname = a.Cname,
Sex = a.Sex,
Nation = a.Nation,
Identitycard = a.Identitycard,
InterviewDate = a.InterviewDate,
Hdate = a.Hdate,
PredeliverDate = a.PredeliverDate,
Pstatus = a.Pstatus == null ? string.Empty : EnumExtension.GetDescription((InterviewStatus)((int)a.Pstatus)),
AgentName = agent == null ? string.Empty : agent.AgentShortName,
ChannelCategory = payment == null ? string.Empty : payment.ChannelCategory
});

var dlrRP04List = dlrRP04List1.Concat(dlrRP04List2).ToList();
-一个大坑 2019-02-19
  • 打赏
  • 举报
回复
引用 4 楼 娃都会打酱油了 的回复:
DefaultIfEmpty有个重载方法允许你自己 定义默认值, 你可以设置一个非空值,这样保证与c 进行join时不会产生null异常,然后在select的地方对这个默认值做特殊处理

awhere这样写长了查询会报错?

Expression<Func<dlrRP04Model, bool>> awhere
// (dlrRP04Model.InterviewDate==null ? true : o.InterviewDate == dlrRP04Model.InterviewDate) &&
// (string.IsNullOrEmpty(dlrRP04Model.Plant) ? true : o.Plant == dlrRP04Model.Plant) &&
// (string.IsNullOrEmpty(dlrRP04Model.Deptid) ? true : o.Deptid == dlrRP04Model.Deptid) &&
// (string.IsNullOrEmpty(dlrRP04Model.Emplid) ? true : o.Emplid == dlrRP04Model.Emplid) &&
// (dlrRP04Model.Hdate==null ? true : o.Hdate == dlrRP04Model.Hdate) &&
// (dlrRP04Model.Pstatus==null ? true : o.Pstatus == dlrRP04Model.Pstatus) &&
// (string.IsNullOrEmpty(dlrRP04Model.ChannelCategory) ? true : o.PaymentCodeNavigation.ChannelCategory==dlrRP04Model.ChannelCategory) &&
// (string.IsNullOrEmpty(drpChannelItem) ? true : o.PaymentCodeNavigation.ChannelItem==drpChannelItem);

public List<T> GetList(Expression<Func<T, bool>> @where)
{
return _repository.Get(@where).ToList();
}

public virtual bool Exist(Expression<Func<T, bool>> @where = null)
{
return Get(where).Any();
}


  • 打赏
  • 举报
回复
DefaultIfEmpty有个重载方法允许你自己 定义默认值, 你可以设置一个非空值,这样保证与c 进行join时不会产生null异常,然后在select的地方对这个默认值做特殊处理
-一个大坑 2019-02-19
  • 打赏
  • 举报
回复
引用 2 楼 正怒月神 的回复:
left join 然后去除空值,不可以吗?
我看你已经left join 了

不行,我把a表的PaymentCode 改为null查询就报错,有数据就是正常的
正怒月神 版主 2019-02-19
  • 打赏
  • 举报
回复
left join 然后去除空值,不可以吗? 我看你已经left join 了

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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