Próbuję zrozumieć pewne implikacje wydajności LINQ z darmowego ebooka przez RedGate ftp://support.red-gate.com/ebooks/under-the-hood-of-net-memory-management-part1.pdfCzy można wywołać metodę nazwaną w wywołaniu Gdzie?
Na stronie 157-158 w tej książce, stworzyli następujący przykład.
Order[] pastDueAccounts = null;
DateTimedueDate = DateTime.Today.AddDays(-7);
using(varcontext = new Context())
{
pastDueAccounts = context.Accounts.Where(account => account.DueDate < dueDate).ToArray();
}
Następnie ponownie uwzględniono część wyrażenia lamda w następującej funkcji.
public bool PastDueAccount(Account account)
{
return account.DueDate < DateTime.Today.AddDays(-7);
}
W końcu użyli tej funkcji w następujący sposób.
Order[] pastDueAccounts = null;
using(varcontext = new Context())
{
pastDueAccounts = context.Accounts.Where(account => PastDueAccount(account)).ToArray();
}
podstawie tego, co ja zbadane dotąd jej nie możliwe do uruchomienia tej kwerendy LINQ jako LINQ nie będzie w stanie rozpoznać metodę i nie można przełożyć na wyrażenie sklepu. Zastanawiam się, czy ten przykład jest zły i po prostu niemożliwy do uruchomienia, czy też po prostu mam trudności ze zrozumieniem, jak zasymulować ten problem?
To jest złe i nie zadziała, ponieważ nie jest to wyrażenie lambda i nie może zostać ocenione przez dostawcę zapytań. – casperOne
Dosłownie mam to działa przeciwko instalacji EF mam. – Gromer
Jeśli działa, filtrujesz * na kliencie *, a wywołanie 'Gdzie' ocenia wyniki z' IEnumerable 'i * not * tłumacząc filtr po stronie serwera. Pamiętaj, że '' IQueryable 'pochodzi z' IEnumerable ', więc wszystkie metody rozszerzeń na' IEumerumeracie 'będą działać na' IQueryable 'i nie zawsze jest oczywiste, gdzie nastąpi przejście. –
casperOne