【问题标题】:Perform inner join in LINQ query在 LINQ 查询中执行内部联接
【发布时间】:2016-11-29 09:13:22
【问题描述】:

我需要加入 LINQ 查询,我已经单独完成但很难在一个过程中完成。

SQL 脚本

SELECT af.submission_id, af.created_date, af.surname,af.first_name
FROM app_forms af
INNER JOIN (SELECT * FROM sync_audit_log sal WHERE sal.log_Status='EP' AND sal.lookup_id IS NULL AND id=(SELECT Max(id) FROM sync_audit_log sal2 WHERE  sal.submission_id=sal2.submission_id)) sal ON sal.submission_id=af.submission_id 
LEFT JOIN ebs_sync es ON af.submission_id=es.submission_id
WHERE es.person_code IS NULL

LINQ

 var query = (from af in _uof.Web_AppFormsRepository.GetAll()
                         select af).ToList();

 var query2 = (from sal in _uof.Web_SyncAuditLogRepository.GetAll().Where(sal => sal.LOG_STATUS.Equals("EP") && sal.LOOKUP_ID!=null )
                          select sal.ID).ToList();

 var query3 = (from sal2 in _uof.Web_SyncAuditLogRepository.GetAll()
                          select new { sal2.ID }).ToList();

【问题讨论】:

标签: c# sql linq


【解决方案1】:

首先你应该明白,当你调用 ToList() EF 请求数据库时,我的意思是现在你对 db 做了 3 个独立的请求,而不是只有一个。仅当您准备好执行一个主查询时才调用 ToList。

关于加入Linq has join operator just use it 您可以使用类似 sql 的语法或表达式语法 see this question for examples

【讨论】:

  • 我很清楚 ToList 会命中数据库......我保留 linq 脚本以了解每个行为和结果
【解决方案2】:
IEnumerable<T> leftInnerJoin = from i in left join j in right on i.condition equals j.condition select i;

IEnumerable<T> leftOuterJoin = from i in left join j in right on i.condition equals j.condition into grp from k in grp.DefaultIfEmpty() where k == null select i;

IEnumerable<T> rightOuterJoin = from i in right join j in left on i.condition equals j.condition into grp from k in grp.DefaultIfEmpty() where k == null select i;

IEnumerable<T> groupJoin = leftOuterJoin.Union(rightOuterJoin).Union(leftInnerJoin);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多