[英]Avoid client evaluation while maintain clean code in EF Core 3
我需要向我的數據庫編寫更復雜的查詢。 通過客戶端評估很容易維護干凈的代碼,但我正在處理大量數據並且需要保持我的后端快速。
客戶實體就是一個很好的例子。 這就是我的查詢現在的樣子:
public class CustomerFilter : AbstractProjectFilter
{
public CustomerFilter(string query, bool includeNotSet, ICollection<string> customers) :
base(e => (customers == null)
|| (includeNotSet && e.Customer == null)
|| (customers.Contains("Company") && e.Customer.Type == CustomerType.Company &&
EF.Functions.Like((((CustomerCompany)e.Customer).Name + " " + ((CustomerCompany)e.Customer).Crn + " " + ((CustomerCompany)e.Customer).VatRegNo), "%" + query + "%"))
|| (customers.Contains("Person") && e.Customer.Type == CustomerType.Person &&
EF.Functions.Like(((CustomerPerson)e.Customer).Forename + " " + ((CustomerPerson)e.Customer).Surname, "%" + query + "%"))
|| (customers.Contains("Evidence") && e.Customer.Type == CustomerType.InEvidence &&
EF.Functions.Like(e.Customer.EvidenceName, "%" + query + "%"))
)
{
}
}
啟用客戶端評估后,這會更加簡潔,因為我可以使用這種方法來創建基於客戶派生類型的名稱字符串,並使用擴展方法(我故意避免使用虛擬方法),並使用它來縮短我的查詢和清潔:
public static string NameString(this Customer customer)
{
if (customer.IsObjectNull())
return string.Empty;
return customer.Type switch
{
CustomerType.InEvidence => ((CustomerInEvidence) customer).EvidenceName,
CustomerType.Person => (((CustomerPerson) customer).Forename + " " +
((CustomerPerson) customer).Surname),
CustomerType.Company => ((CustomerCompany) customer).Name,
_ => throw new ArgumentOutOfRangeException()
};
}
我的問題:有沒有辦法告訴數據庫如何處理方法而不需要從中獲取數據? 我缺少 Fluent API 的一些配置?
如果我能夠在使用 Linq.Dynamic 進行排序時使用這些“方法”,那就太好了,如下所示:
var orderedCustomers = await customers.OrderBy("*string_created_by_some_method* ASC").ToListAsync();
有沒有辦法告訴數據庫如何處理方法而不需要從中獲取數據? 我缺少 Fluent API 的一些配置?
沒有什么直截了當的方式,這就是Expression
的方式!
在不獲取數據的情況下與數據庫通信的唯一方法是使用Expressions
。 它不是很直,但可以做你需要的一切。
你可以在這里看到一個例子
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.