c# 操作兩張表,將 bill 與 employee 不同的資料寫入 employee。


最近比較 lambda ,linq ,sql 哪個好?
同樣是要操作兩張表,
目的要將 bill 與 employee 不同的資料寫入 employee,
結果發現一向好操作的 lambda 居然要寫這麼大坨。
看來 sql 還是有它方便的地方。

Lambda:
                using (var smsDb = new smsEntities())
                {
                    var billAcpdIdList = smsDb.SMS_Bill
                                    .Select(item => item.ACPD_ID)
                                    .ToList();

                    using (var cecDb = new Entities())
                    {
                        var employeeList = cecDb.EMPLOYEE
                            .Where(item =>
                                !item.EMP_ID.Contains("emp"))
                            .Where(item => !billAcpdIdList.Contains(item.EMP_ID))
                            .Select(item => new SMS_Bill
                            {
                                ACPD_ID = item.EMP_ID
                            })
                            .ToList();
                    }
                }

LinQ:

                using (var smsDb = new smsEntities())
                {
                    using (var cecDb = new Entities())
                    {
                        var list =
                            (from employee in cecDb.EMPLOYEE
                            where !SqlMethods.Like(employee.EMP_ID, "%[_]_")
                                  && !(from bill in smsDb.SMS_Bill
                                       select bill.ACPD_ID).Contains(employee.EMP_ID)
                            select new SMS_Bill
                            {
                                ACPD_ID = employee.EMP_ID,
                                Account = 0,
                            }).ToList();

                        smsDb.SMS_Bill.AddRange(list);
                        smsDb.SaveChanges();
                    }
                }

SQL

    INSERT SMS_BILL(ACPD_ID)

    SELECT EMP_ID FROM EMPLOYEE

    WHERE (EMP_ID NOT LIKE '%[_]_')

    AND EMP_ID NOT IN (SELECT ACPD_ID FROM SMS_BILL)

留言