سلام کدهای زیر مربوط به متد Get در کلاس CURDGenericMethod است :
public virtual IEnumerable<Tentity> Get(
Expression<Func<Tentity, bool>> whereVariable = null,
Func<IQueryable<Tentity>,
IOrderedQueryable<Tentity>> orderbyVariable = null,
string joinString = "")
{
IQueryable<Tentity> query = _table;
if (whereVariable != null)
{
query = query.Where(whereVariable);
}
if (orderbyVariable != null)
{
query = orderbyVariable(query);
}
if (joinString != "")
{
foreach (string joins in joinString.Split(','))
{
query = query.Include(joins);
}
}
return query.ToList();
}
سوالم این است که اگر بخواهیم از پارامترهای این متد که whereVariable و orderbyVariable و همینطور joinString که رشته است در داخل کنترل ها استفاده کنیم چگونه می توان اینکار را انجام داد یعنی شرط گذاشتن و ارتباط با جداول دیگر از طریق join و غیره... میخواهم از طریق رشته به دیتابیس query ارسال و اطلاعات دریافت کنم و از روشهای دیگر مانند Lambda مانند :
IUW.UserManger.Get.Where_ و غیره نمیخواهم از جداول دیتابیس اطلاعات دریافت کنم... ممنون می شوم مثال بزنید یعنی در کنترلر وقتی همین دستور (نحوه ارسال پارامتر)IUW.UserManger.Get را استفاده میکنم پارامترها چگونه هستند....
با تشکر و سپاس
با توجه به متد Get شما و پارمترهای اون برای ایجاد شرط شما باید از Lambda استفاده کنید. به عنوان مثال عبارت زیر رو درنظر بگیرید
_db.userAlertRepositoryUW.Get(u => u.id == 5);
همچنین اگر بخواید یک جدول دیگه رو Join کنید با جدولی که در حال Select زدن روی اون هستید می تونید مثل عبارت زیر عمل کنید
_db.userAlertRepositoryUW.Get(u => u.id == 5,null,"UserTbl");
در کد بالا علاوه بر اینکه یک شرط رو اعمال کردیم با جدول UserTbl هم جوین رو انجام دادیم. البته در اینجا باید دقت داشته باشید که UserTbl حتما به عنوان کلید خارجی از قبل در Model شما تعریف شده باشه. در کد زیر UserTbl رو هم به عنوان کلید خارجی تعریف کردیم.
public class UserAlert
{
[Key]
public int UserAlertID { get; set; }
public string UserID { get; set; }
//Foreign Key
[ForeignKey("UserID")]
public virtual ApplicationUsers UserTbl { get; set; }
}
همچنین اگر با بیش از یک جدول قصد داشته باشید Join کنید هم کافیه به صورت زیر عمل کنید
_db.userAlertRepositoryUW.Get(u => u.id == 5,null,"UserTbl","Table2","Table3");
در بالا هم بایستی حتما Table1 و Table2 به عنوان کلید خارجی در مدل تعریف شده باشن.
در این کدهایی که شما ارسال کردید میشه مثل بالا عمل کرد. اما اگر قصد دارید به نحوی متفاوت عمل کنید یا کوئری شما جوری هست که نمیتونید از کدهای بالا استفاده کنید یا شرایطی داره که استفاده از کدهای بالا براتون سخته میتونید یک Repository تعریف کنید و کوئری خودتون رو توی ریپازیتوری بنوسید و در پروژه استفاده کنید
موفق باشید
با سلام خیلی خیلی ممنون از پاسخ
با چند شرط چطور؟ لطفا این موضوع را هم مثال بزنید، ولی پس عملا یعنی در متد Get نمیتوان سرچ رو با چند فیلتر انجام داد؟
به کد ذیل مجددا نگاه کنید بوسیله SQLClient یک کوئری به صورت رشته به دیتابیس ارسال و اطلاعات فراخوانی می شود:
کد زیر :
string queryString = "SELECT USR.*, AD.*, HI.*," +
"GEND.GeneralGenderName,GMAZ.GeneralMazhabName," +
"GTAB.GeneralTabeiyatName,GVAT.GeneralVazeiyatTaahholName," +
"GenCountry.GeneralCountryName,GenState.GeneralStateName," +
"HI.HitehName" +
"FROM AspNetUsers AS USR" +
"INNER JOIN RoleGroups_tbl AS RU ON(USR.RoleUser = RU.RoleGroupNameEN)" +
"INNER JOIN GeneralGenders_tbl AS GEND ON(USR.GeneralGenderID = GEND.GeneralGenderID)" +
"INNER JOIN GeneralMazhabs_tbl AS GMAZ ON(USR.GeneralMazhabID = GMAZ.GeneralMazhabID)" +
"INNER JOIN GeneralTabeiyats_tbl AS GTAB ON(USR.GeneralTabeiyatID = GTAB.GeneralTabeiyatID)" +
"INNER JOIN GeneralVazeiyatTaahhols_tbl AS GVAT ON(USR.GeneralVazeiyatTaahholID = GVAT.GeneralVazeiyatTaahholID)" +
"INNER JOIN HitehUser_tbl AS HIU ON(USR.Id = HIU.Id)" +
"INNER JOIN Hiteh_tbl AS HI ON(HIU.HitehID = HI.HitehID)" +
"WHERE HI.HitehName = N'هنری' OR GEND.GeneralGenderName LIKE N'%زن%'";
حالا در قسمت انتهای این کوئری شرط ها قرار دارند و شرایط یا فیلترهای جستجویی که از سمت کلاینت به سمت سرور ارسال می شود را به عنوان متغیر به جای کلمات زن و هنری قرار میدهم و جستجوی من انجام می شود، حالا اگر بخواهیم پارامترهای این شرط ها در دستور Get تعریف کنیم چگونه می توانم یک پارامتر از نوع لامبدا تعریف کنم و بر اساس فیلتر و به جای شرط در داخل متد Get از آن استفاده کنم؟ البته این رشته را کوتاه تر کردم که خواناتر باشد وگرنه جداول نزدیک به 20 جدول و بیشتر از این است، مشکل اصلی من این است...
پاسخ به mghb
اگر شرطهاتون پیچیده هست بهترین راه حل اینه که کوئری هاتون رو توی Repository بنویسید. هم ساده تر میشه هم تسلط بهتری روی کوئری دارید.
شرط ها پیچیده نیستند و فیلدها ثابت هستند و شرط ها را با متغیر میتوانم به رشته اضافه کنم و خروجی مورد نظرم رو بگیرم میخواستم بدانم متد Get چه کارایی برای جستجوهای پیچیده میتواند داشته باشد... این t Repository که میفرمایید برای جستجو چگونه است... مراحل کار را میتوانید مرحله به مرحله با ذکر دو سه جدول توضیح دهید؟
تابعی که شما نوشتید و اسم اون رو Get گذاشتید یک تابع کاستومایز شده هست و هیچ دلیلی نیست که حتما باید در پروژه ها دقیقا از همین تابع استفاده بشه. خب شما برای اینکه در حین کار و توی پروژه کدنویسی کمتری انجام بدید و کار زیباتر بشه از این تابع استفاده کردید (گرچه شما توی سوال خیلی ناقص توضیح دادید و اصلا اشاره نکردید _iuw چی هست یا UserManger چی هست)
اما در مجموع شما آزاد هستید که برای کارتون هر کوئری که نیاز دارید رو بنویسید. من یک مثال رو براتون میگم
فرض کنید لیست کاربرانی رو میخواید نمایش بدید که Role اونها Admin نیست. برای این کار اگر بخواید از این تابع Get استفاده کنید شاید قدری کار سخت باشه چون بین جدول AspNetUsers و AspNetUserRoles کلید خارجی وجود نداره.
به همین منظور شما می تونید به طریق زیر انجام بدید
اول در پوشه Model یک ViewModel ایجاد کنید و مثلا اسم اون رو UserListViewModel قرار بدید
public class UserListViewModel
{
public string userId { get; set; }
public string firstName { get; set; }
public string family { get; set; }
public string Roles { get; set; }
}
در پوشه Model یک پوشه جدید به نام Repository ایجاد کنید و یک Repository به نام UserManagementRepository ایجاد کنید و کدهای زیر رو در اون بنویسید
public class UserManagementRepository : IUserManagementRepository
{
private readonly ApplicationDbContext _context;
public UserManagementRepository(ApplicationDbContext context)
{
_context = context;
}
public List<UserListViewModel> GetAllUsersWithRoles()
{
var userListQuesry = (from u in _context.Users
join
ur in _context.UserRoles on u.Id equals ur.UserId
select new UserListViewModel()
{
firstName = u.FirstName,
family = u.Family,
userId = u.Id,
Roles = ur.RoleId
});
return userListQuesry.Where(u=>u.Roles != "AdminID").ToList();
}
}
همانطوری که در ریپازیتوری بالا می بینید در تابع GetAllUsersWithRoles با Join کردن 2 جدول Users و UserRole مشخصات کاربران به همراه نقش های اونها رو در ویومدل UserListViewModel ذخیره کردیم و در انتها کنترل کردیم که نقش برابر با Admin نباشه.
برای استفاده از این ریپازیتوری کافیه یک Interface تعریف کنید و در کنترلها استفاده کنید
public interface IUserManagementRepository
{
List<UserListViewModel> GetAllUsersWithRoles();
}
و برای استفاده از این اینترفیس در کنترلر هم میتونید به شکل زیر عمل کنید
public class UserManagementController : Controller
{
private readonly IUserManagementRepository _ium;
public UserManagementController(IUserManagementRepository ium)
{
_ium = ium;
}
public IActionResult Index()
{
var model = _ium.GetAllUsersWithRoles();
return View(model);
}
}
موفق باشید
سلام خیلی خیلی ممنون از پاسخ و ارائه جزئیات ولی راستش همه اینایی که گفتید رو میدانستم و از روش Unit Of Work استفاده میکنم و _IUW مخفف اینترفیس همین تکنولوژی می باشد که در بالا اشاره کرده بودم و منظورم این بود با روش Repository یا UnitOfWork متدی بنویسم که شرط ها رو به صورت رشته دریافت کند و با همین روشها به من برگرداند، در ضمن تمام کوئری های فوق را خیلی پیچیده تز از اینها یعنی با بیست جدول از 68 جدول ساخته شده تاکنون در پروژه استفاده میکنم... اتفاقا چون متد Get کاستومایز شده است برای همین سوال کردم بودم چون فکر میکردم بتوانم راحت تر مثل SQLClient از آن استفاده کنم ولی چون پارامترهای آن را آشنایی نداشتم سوال کردم ، الان میخواهم بدانم که میتوانم چند شرط از جنس lambda را در یک متغیر یا آبجکت تعریف کنم و به به عنوان پارامتر به Get بفرستم؟ شرطها شرایط خاصی دارند و برای همین ممکن است که شرط هایی که از جنس lambda نوشته می شوند متفاوت باشد برای همین میخواهم که قبل از ارسال به یک متغیری اضافه شود و به پارامتر get فرستاده شود... join آن یکی است یعنی بیست جدول را می توانم در پارامتر اضافه کنم مشکل من این شرط است...
میدانم میشود ولی راهکارش را نمیدانم... اگر نشود ظاهرا باید همان روش خودم برای جستجو باید پیاده سازی کنم که فیلترهای جستجو را به عنوان رشته ی query به SQLclient بفرستم، فکر میکردم بتوانم در دستور get چندین شرط چه به صورت form in و چه به صورت lambda استفاده کنم البته مثالهایی در اینترنت جستجو کردم ولی باز به چیزی که میخواستم نرسیدم...
ولی باز هم متشکر از پاسخ شما اگر راهکاری دراین خصوص دارید یعنی اضافه کردن کاستومایز شرط های مختلف در یک رشته یا یک متغیر از جنس lambda و ارسال آن متغیر به پارامتر مربوط به شرط دستور get...
تشکر و سپاس
شما میتونید از طریق همون متد Get هم که نوشتید همه کار رو انجام بدید. اما خب شرایط خاص خودشون داره. اگر کوئری هاتون سنگینه و تعداد Join ها زیاده بهترین راه حل استفاده از دستورات Linq To Entity هست . یعنی همون مثالی که ذکر شد
from u in _context.Users
join
ur in _context.UserRoles on u.Id equals ur.UserId
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
76
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
109
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1033
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
429
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1356
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4798
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
214
- پاسخ :
1
|
تاریخ :
1403/07/26
- ساعت :
09:00:00 PM
- بازدید :
117
- پاسخ :
0
|
تاریخ :
1403/05/16
- ساعت :
09:57:00 AM
- بازدید :
396
- پاسخ :
2
|
تاریخ :
1403/06/25
- ساعت :
11:39:00 PM
- بازدید :
567
- پاسخ :
1
|
تاریخ :
1401/02/24
- ساعت :
02:17:00 PM
- بازدید :
2011
- پاسخ :
1
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
76
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
109
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1033
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
429
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
930
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1356
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4798
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1160
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
597
- پاسخ :
1
|