如何重构此linq查询?

时间:2018-07-19 00:39:03

标签: c# entity-framework linq

我在linq查询下得到了以下查询,在6种不同的情况下,其中95%保持不变。如何重构它以便可以在一个函数中编写并在所有情况下使用?

var results = await (from r in Requests
                join ra in RequestAuthorisers
                    on cr.ID equals ra._REQUEST_ID
                where cr.FACILITY_ID == facilityId
                      && (r._REQUEST_STATUS_ID == RequestSubmitted || r._REQUEST_STATUS_ID == RequestPartiallyAuthorised )//check against more status codes based on different conditions
                      && ra.FACILITY_USER_ID == facilityUserId//don't check this if admin
                      && ra.AUTHORIZATION_DATE != null
                      && ra.REJECTION_DATE == null
                select new
                {
                    FacilityId = r.FACILITY_ID,
                    VersionId = r.VERSION_ID,
                    CreatedByTitle = r.CREATED_BY_USER_TITLE,
                    CreatedByFirstName = r.CREATED_BY_USER_FIRST_NAME,
                    CreatedByLastName = r.CREATED_BY_USER_LAST_NAME,
                    RequestDate = r.SUBMITTED_DATE,
                    RequestId = r.ID,
                    RequestType = r._TYPE_ID,
                    Status = r._REQUEST_STATUS_ID
                }).ToListAsync();

            var RequestResponse = results.Select(
                r => new RequestResponseDto
                {
                    FacilityId = r.FacilityId,
                    VersionId = r.VersionId,
                    CreatedByTitle = r.CreatedByTitle,
                    CreatedByFirstName = r.CreatedByFirstName,
                    CreatedByLastName = r.CreatedByLastName,
                    RequestDate = Convert.ToDateTime(r.RequestDate).ToString("s"),
                    RequestType = ((RequestType)r.RequestType).ToString(),
                    Status = ((RequestStatus)r.Status).ToString()
                }).ToList();

由于方案/查询的不同之处仅在于,如果isAdmin并检查了更多状态代码(如上所述),其余部分将保持不变。

我正在使用LINQ to EF(数据库优先)。 预先感谢。

1 个答案:

答案 0 :(得分:1)

为什么不将布尔值传递给方法:

(defn process-line
  [line ctr]
  (swap! ctr inc)
  (->> (apps-for-org (first line))
       (reduce #(conj %1 (add-results-to-input line %2)) [])))