یک کوئری غلط با 20 برابر کاهش کارایی
این Query رو در نظر بگیرید !
Dim Query = (From c In _Db.Users
Select New With {.Id = c.Id,
.Permission = GetpermissionTitle(c.Permission)
})
یک جدول به نام Users دارم و یک جدول به نام Permission هر یوسر از چندین پرمیژن استفاده می کنه من به خاطر اینکه عنواین پرمیژن رو بدست بیارم و با , از هم جدا کنم از تابع زیر استفاده می کنم
Function GetpermissionTitle(t As Data.Linq.EntitySet(Of Permission)) As String
Dim _Str As String = ","
For Each _Item In t
_Str = _Str & _Item.Title & ","
Next
Return _Str
End Function
اما این روش به شدت غلطه و به ازای هر Row باید این تابع رو اجرا کنه که به شدت کارایی رو پایین میاره
در کل هدفم اینه پرمیژن ها رو بتونم با , از هم جدا کنم بهترین راه حل چیه !
نقل قول: یک کوئری غلط با 20 برابر کاهش کارایی
نیازی نیست به این حلقه
شما از Navigation Property ها میتونید بهره ببرید با eager loading
شما باید برای اینگونه موارد دو موجودیت داشته باشید
جدول User
جدول Perission
و یک جدول واسط برای روابط چند به چند
کوئری زیر البته با C# هست نمونهم ثال شما هست
public ObservableCollection<Role> RolesOfUsers(User user)
{
List<Role> list = new List<Role>();
foreach (var role in _roles.Include(x => x.Users).Where(x => x.Id == user.Id))
list.Add(role);
return new ObservableCollection<Role>(list);
}