EF core 中用lambda表達式和Linq的一些區別


轉眼一看,又過了10幾天沒有寫博客了,主要還是沒有什么可以寫的,因為遇到的問題都不是很有價值。不過最近發現用lambda表達式,比用Linq的代碼量會少一些,而且也方便一些。不過兩者都差不多,相差不是特別大。

在EF core中,表和表之中都有對應的關系,例如一對一,一對多,還有多對多。要實現一對一,一對多加上主外鍵,實現多對多則需要加上一個中間表,這樣結構清晰,維護也非常的方便。

那我們在使用EF core 勢必要用到非常多的跨表查詢,來看看linq是怎樣查找數據庫中的信息的:

var query = from a in db.ExaminationOrderInfo
                        join b in db.ExaminationOrganization on a.OrganizationId equals b.OrganizationId
                        join c in db.Customerinfo on a.CustomerId equals c.CustomerId
                        join d in db.Supplierinfo on a.OrganizationId equals d.OrganizationId
                        where (a.IsDelete == 0)
                        && (appointmentResult == null || a.AppointmentResult == appointmentResult)
                        && (isPaperReport == null || a.IsPaperReport == isPaperReport)
                        && (examinationStatus == null || a.ExaminationStatus == examinationStatus)
                        && (name == null || a.Name == name)
                        && (id == null || a.IdCard == id)
                        && (organizationName == null || b.Name == organizationName)
                        && (customer == null || c.Name == customer)
                        && (supplierName == null || d.Name == supplierName)
                        orderby a.AppayTime
                        select new ExaminationOrderInfoDto
                        {
                            Type = a.Type == 1 ? "取消預約" : "預約",
                            IdCard = a.IdCard,
                            Name = a.Name,
                            StartTime = a.StartTime.ToString(),
                            EndTime = a.EndTime.ToString(),
                            AppayTime = a.AppayTime,
                            ExaminationTime = a.ExaminationTime.ToString(),
                            AppointmentResult = a.AppointmentResult == 2 ? "成功" : a.AppointmentResult == 1 ? "失敗" : "待處理",
                            ExaminationStatus = a.ExaminationStatus == 1 ? "已登記" : "未登記",
                            IsPaperReport = a.IsPaperReport == 1 ? "已打印" : "未打印",
                            ElectronicReport = a.ElectronicReport,
                            Organization = b.Name,
                            Customer = c.Name,
                            SupplierName = d.Name
                        };

可以看出連接了三張表去查詢也就是 join....on.... ,然后加上排序,這樣代碼會偏多一點。

那么我們來看看使用lambda表達式會怎么樣:

 var query = db.ExaminationOrderInfo.Where(e => e.IsDelete == 0
            && (appointmentResult == null || e.AppointmentResult == appointmentResult)
            && (isPaperReport == null || e.IsPaperReport == isPaperReport)
            && (examinationStatus == null || e.ExaminationStatus == examinationStatus)
            && (string.IsNullOrEmpty(name) || e.Name == name)
            && (string.IsNullOrEmpty(customer) || e.Customerinfo.Name == customer)
            && (string.IsNullOrEmpty(id) || e.IdCard == id)
            && (string.IsNullOrEmpty(organizationName) || e.ExaminationOrganization.Name == organizationName)
            && (string.IsNullOrEmpty(supplierName) || e.ExaminationOrganization.SupplierInfo.Name == supplierName)).Select(e => new ExaminationOrderInfoDto
            {
                Type = e.Type == 1 ? "取消預約" : "預約",
                IdCard = e.IdCard,
                Name = e.Name,
                Expire = DateTime.Now > e.ExaminationTime ? "" : "",
                StartTime = e.StartTime.ToString(),
                EndTime = e.EndTime.ToString(),
                AppayTime = e.AppayTime,
                ExaminationTime = e.ExaminationTime.ToString(),
                AppointmentResult = e.AppointmentResult == 2 ? "成功" : e.AppointmentResult == 1 ? "失敗" : "待處理",
                ExaminationStatus = e.ExaminationStatus == 1 ? "已登記" : "未登記",
                IsPaperReport = e.IsPaperReport == 1 ? "已打印" : "未打印",
                ElectronicReport = e.ElectronicReport,
                Organization = e.ExaminationOrganization.Name,
                Customer = e.Customerinfo.Name,
                SupplierName = e.ExaminationOrganization.SupplierInfo.Name
            }).OrderBy(e => e.AppayTime);

我們可以看到使用lambda表達式就沒有太多的連接代碼了,如果想要查詢的話,直接就e.Customerinfo.Name 可以得到Customerinfo表的name了,這是為什么呢,因為ExaminationOrderInfo這個實體中有這個字段:

 public Customerinfo Customerinfo { get; set; }

這就將ExaminationOrderInfo和Customerinfo連接起來了,一個ExaminationOrderInfo對應一個Customerinfo,而相信大家也留意到了ExaminationOrganization這個表了,里面對應的關系是這樣的:

public ICollection<ExaminationOrderInfo> ExaminationOrderInfo { get; set; }

也就是說一個ExaminationOrganization對應多個ExaminationOrderInfo。那么還有 e.ExaminationOrganization.SupplierInfo.Name,為何需要這樣呢,是因為ExaminationInfo是通過ExaminationOrganization這張表和Supplier連接的。

相信大家已經清楚了這兩張查詢方式的不同,建議大家兩種都去了解和熟悉,這樣遇到問題的時候有多種思考方式,不過我一般建議大家用lambda表達式,這樣代碼非常簡潔,易讀性也較高。

最后,有什么錯誤請指出,互相學習。謝謝大家!




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM