Linq ifodasida o'zgartirilgan yopilishga kirishning oldini olish uchun nima qilish kerak?

Menda quyidagi kod bor:

ServiceSoapClient service = new ServiceSoapClient();
    var dataSource = (from u in _db.Sessions
                      where u.DeletedOn == null
                      select new
                      {
                          SessionId = u.UploadSessionId,
                          FileName = u.FileName,
                          CreatedBy = u.User.UserName,
                          Partner = u.Company.Name,
                          CreatedOn = u.CreatedOn,
                          Visible = service.IsSessionProcessing(u.UploadSessionId)
                      })
                    .OrderByDescending(x => x.CreatedOn);

... Albatta bu erda muammo dataSource foydalanayotganimda ifoda haqiqiyligi hisoblangan, chunki o'zgartirilgan yopilishga ega bo'lgan Visible = service.IsSessionProcessing (u.UploadSessionId) bir joyda yani .ToList() yoki shunga o'xshash narsalarni tayyorlash.

Bu erda muammo shu: .ToList() ni darhol amalga oshira olmayapman, chunki uni boshqarish uchun ma'lumotlar manbai sifatida ishlatish kerak.

Buni Linqdan qochishning biron bir usuli bormi? Haqiqiy qadriyatlar bilan hisoblab chiqilsa, so'zning o'zida mahalliy o'zgaruvchidan foydalanishim mumkinmi?

1
Biror narsa yo'qolmasam, ushbu kod allaqachon bu ifoda uchun u degan ma'noni beradi ... o'zgartirilgan yopilish deb hisoblaydimi?
qo'shib qo'ydi muallif Marc Gravell, manba
yaxshi deb o'ylayman, ularning barchasi true yoki false , shuning uchun ko'p variantlari emas; Biroq, SessionId farq qiladi?
qo'shib qo'ydi muallif Marc Gravell, manba
Qarang ... u yopish emas, shuning uchun na u yoki u.UploadSessionId , albatta, o'zgartirilgan, bir yopiq bo'lishi mumkin. Endi sizning _db.Sessions nima (va sanitariya-tesisat o'rtasida) nima bo'lishidan qat'i nazar, u erda biron bir xato bo'lishi mumkin ... lekin o'zgartirilgan qoplamalar bilan bog'liq emas.
qo'shib qo'ydi muallif Marc Gravell, manba
Qaytariladigan anonim tipdagi to'plamdan foydalanganda ... xizmatning barcha qiymatlari. IsSessionProcessing (u.UploadSessionId) oxirgi qiymatga teng ...
qo'shib qo'ydi muallif TheBoyan, manba

2 javoblar

"O'zgartirishni yopish" bu erda service . Ya'ni ... service ni qayta belgilamang.

1
qo'shib qo'ydi
@bojanskr nima deganim: service - faqat yopish bu erda. Shunday qilib, agar siz "o'zgartirilgan yopilish" ni ko'rsangiz, bu yagona nomzod. Ko'proq ehtimol (IMO): xato bu sizning fikringiz emas.
qo'shib qo'ydi muallif Marc Gravell, manba
Men to'liq tushunganimga amin emasman. Siz uni ling so'zida qayta chaqirishga yoki uni qayta chaqirishga urinmaysizmi?
qo'shib qo'ydi muallif TheBoyan, manba
Yordam uchun tashakkur, deb o'ylayman bufet qaerdaligini bilaman va siz haqsiz, u yopilishda emas, balki, ehtimol men qo'ng'iroq qilayotgan xizmatda
qo'shib qo'ydi muallif TheBoyan, manba

Haqiqiy bug, ma'lumotlar bazasi operatsiyasini ifodalovchi ifodani o'ylamaydigan ifoda qilish sharoitida funktsiyani chaqirishga urinishdir. Haqiqatdan ham quyidagilarni sinab ko'ring:

// Database operation, no soap client funny business here.
 var list = (
  from u in _db.Sessions
  where u.DeletedOn == null
  orderby x.CreatedOn descending
  select new
  {
   SessionId = u.UploadSessionId,
   FileName = u.FileName,
   CreatedBy = u.User.UserName,
   Partner = u.Company.Name,
   CreatedOn = u.CreatedOn,
  }).ToList();

// From now on you are not in a database anymore, it's pure linq-to-objects. You can call the service.
ServiceSoapClient service = new ServiceSoapClient();
var dataSource = (from u in list select new {
 SessionId = u.SessionId,
 FileName = u.FileName,
 CreatedBy = u.CreatedBy,
 Partner = u.Partner,
 CreatedOn = u.CreatedOn,
 Visible = service.IsSessionProcessing(u.SessionId)
}).ToList();
0
qo'shib qo'ydi