PDA

View Full Version : حرفه ای: ساخت group by داینامیک با linq



sempay_ninjutsu
شنبه 19 اردیبهشت 1394, 11:13 صبح
با سلام
من میخوام یه گروپ بای داینامیک داشته باشم که فیلد هایی که می خوان گروپ بای بشه رو با استفاده از ارایه ای از رشته ها بدم....بعد انتخاب فیلد هایی که می خوام بکنم با استفاده از استرینگ باشه....نمونه کد باشه بهتره و کار بکنه...


var param = new string[1] {"Fname"};

item.GroupBy(param).select(param, "count(lname),sum(amount)");

sempay_ninjutsu
شنبه 19 اردیبهشت 1394, 12:51 عصر
دوستان کسی میتونه اینو تبدیل به یک expression بکنه

value(System.Data.Entity.Core.Objects.ObjectQuery` 1[test_groupby.Customer]).
MergeAs(AppendOnly).GroupBy(t => new <>f__AnonymousType0`2
(Fname = t.Fname, Lname = t.Lname),
(key, group) =>
new <>f__AnonymousType1`3(Key = key.Fname, Count = group.Count(x => x.Active), Sum = group.Sum(t => Convert(t.IntroducerType))))

SabaSabouhi
شنبه 19 اردیبهشت 1394, 12:54 عصر
با سلام
من میخوام یه گروپ بای داینامیک داشته باشم که فیلد هایی که می خوان گروپ بای بشه رو با استفاده از ارایه ای از رشته ها بدم....بعد انتخاب فیلد هایی که می خوام بکنم با استفاده از استرینگ باشه....نمونه کد باشه بهتره و کار بکنه...


var param = new string[1] {"Fname"};

item.GroupBy(param).select(param, "count(lname),sum(amount)");



سلام
اگه LinQ رو خوب یاد بگیری، کار ساده‌ای هست.
شما باید IQueryable درست کنی، و بسته به نیازت اون رو گسترش بدی. اما تو LinQ باید String رو فراموش کنی.
اصولاً LinQ اومده که از string استفاده نکنی.
من خودم بدون استفاده از string همه جور Query پویا می‌گیرم تو برنامه‌هام.
یه مثال:

var queryable = entities.Customers.Where( x=> x.Name == "MyCustomerName" );
if ( condition1 )
queryable = queryable.GroupJoin( entities.Invoices, p=>p.Id, i=>i.CustomerId,
( p, i ) => new { Person = p, InvoiceCount = i.Count(), TotalPurchase = i.Sum( x=> x.Amount ) );


با کمی خلاقیت همه جور Query می‌تونی تو LinQ بگیری.



صبا صبوحی

sempay_ninjutsu
شنبه 19 اردیبهشت 1394, 14:06 عصر
سلام
اگه LinQ رو خوب یاد بگیری، کار ساده‌ای هست.
شما باید IQueryable درست کنی، و بسته به نیازت اون رو گسترش بدی. اما تو LinQ باید String رو فراموش کنی.
اصولاً LinQ اومده که از string استفاده نکنی.
من خودم بدون استفاده از string همه جور Query پویا می‌گیرم تو برنامه‌هام.
یه مثال:

var queryable = entities.Customers.Where( x=> x.Name == "MyCustomerName" );
if ( condition1 )
queryable = queryable.GroupJoin( entities.Invoices, p=>p.Id, i=>i.CustomerId,
( p, i ) => new { Person = p, InvoiceCount = i.Count(), TotalPurchase = i.Sum( x=> x.Amount ) );


با کمی خلاقیت همه جور Query می‌تونی تو LinQ بگیری.



صبا صبوحی
از پاسختون سپاسگذارم..ولی اگه دقت کرده باشین من گفتم میخوام با استرینگ بسازم.....چون تمام ابجکت های من بصورت داینامیک هستن و بنا به نیازی میخواستم استرینگ کار کنم چه تو سلکت گروپ بای و چه تو انتخاب فیلدهایی برای جمع و ... قابل توجه شما بگم اون ابجکت آخری که شما بصورت بی نام تعریف کردین و خروجیو داخل اون ریختین هم بصورت داینامیک می باشد....
اگه لطف کنی خلاقیت به خرج بدی اینو بنویسی ممنون میشم...

sempay_ninjutsu
یک شنبه 20 اردیبهشت 1394, 07:55 صبح
از آخرین ورژن system.linq.dynamic و بصورت زیر از آن استفاده کنید.

string[] fields = { "FName", "LName" };
string aggrigatefield = "new(Sum(َAmount) as Value1,Key as Key)";
string field = string.Format("new({0})", string.Join(",", fields));
// string select = string.Format("new({0})", string.Join(",", aggrigatefield));
var res = context.Personeli.ToList().GroupBy(field, "it")
.Select(aggrigatefield).Cast<object>().ToList();