PDA

View Full Version : سوال: یک کوئری غلط با 20 برابر کاهش کارایی



shahab_ksh
چهارشنبه 07 بهمن 1394, 17:22 عصر
این 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 باید این تابع رو اجرا کنه که به شدت کارایی رو پایین میاره

در کل هدفم اینه پرمیژن ها رو بتونم با , از هم جدا کنم بهترین راه حل چیه !

ali_md110
پنج شنبه 08 بهمن 1394, 21:19 عصر
نیازی نیست به این حلقه
شما از 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);
}