ورود

View Full Version : استفاده از لیست تراکنش اعضاء



sunn789
شنبه 10 آبان 1393, 11:58 صبح
سلام
20 تا عضو داریم هر عضو تعدادی تراکنش داره
این رو نوشتم
var checkOuts = db.CheckOuts.Where(x => x.Users.Lname.Contains(q) || q == null).OrderBy(x=>x.Users.Lname).GroupBy(x=>x.Users.Id);
اما این کل تراکنشها رو میاراه و من میخوام جمع هر کسی رو میاره و زمانی روی جزئیات کلیک کنه تعداد تراکنشها رو بیاره
اگه مبهم بود بفرمایید کامل تر بگم

RIG000
شنبه 10 آبان 1393, 12:45 عصر
حالا کلا تراکنش و این کلمات به کنار .... شما درکل یه دستور selcet میخای .
من اینو متوجه نشدم.
اما این کل تراکنشها رو میاراه و من میخوام جمع هر کسی رو میاره و زمانی روی جزئیات کلیک کنه تعداد تراکنشها رو بیاره
الا ن منظور از جمع یعنی جمع تعداد مقدار های یک ستون حالا برای همه یا برای یک شخص. یا هر شخص؟
من این q رو نفهمیدم از کجا اوردی اصلا واسه چی اوردیش؟

RIG000
شنبه 10 آبان 1393, 13:32 عصر
من یه همچین چیزی نوشتم . ببین این بود منظورت ...

var selectTranc = (from u in context.Users where u.Products.Any()
select new {u.PersonUserName, u.PersonId,u.Products.Sum(p => p.SubTotal).Value}).ToList();
اینجا الان subtotal فیلدی هست که تو جدول product هستش ....
و هر یوزر میتونه هر چند تا subtotal داشته باشه ...
با این کد هر یوزری که تو product باشه همه subtotal هاش رو جمع کن و وبه طور یه value در لیست نشون بده ...
حالا مثلا من و شما و 3 نفر دیگه یوزر هستیم و فقط من و شما تو جدول product دارای مقدار subtotal هستیم .
شما 2 subtotal دارید و من 3 تا .
مقدار های شما 100 و 200 هست و من 50 و 100 و 30 که در خروجی مشخصات ما رو با 300 چاپ میکنه و من رو با 180 .
امیدوارم که کلا" سوالتون بد متوجه نشده باشم :)

sunn789
یک شنبه 11 آبان 1393, 20:27 عصر
اول اینکه اون q یک string هست که متد میگیره از تکس باکس جستجو.
خوب من این کد رو نوشتم
var checkOuts = db.CheckOuts.Select(check=>
new {check.Users.FName,check.Users.Lname, check.Creditor,check.Debtor,check.Decsription}).Wh ere(x => x.Lname.Contains(q) || q == null).OrderBy(x => x.Lname);
اما ...
میخواستم این کد رو اضافه کنم که اصلاً sum رو نمیشناسه
var checkOuts = db.CheckOuts.Select(check=>
new {check.Users.FName,check.Users.Lname, check.Creditor,check.Debtor,check.Decsription ,total= check.Sum}).Where(x => x.Lname.Contains(q) || q == null).OrderBy(x => x.Lname);
خوب من اصلا خواستم بدون sum هم اجراش کنم اما چون از PagedList در پایان استفاده میکنم به این صورت

if (Request.IsAjaxRequest())
{
return PartialView("_Index", checkOuts.ToPagedList(pageNumber, pageSize));
}


به این خطا رسیدم

The model item passed into the dictionary is of type 'PagedList.PagedList`1[<>f__AnonymousType5`5[System.String,System.String,System.Decimal,System. Decimal,System.String]]', but this dictionary requires a model item of type 'PagedList.IPagedList`1[ocucModal.Models.CheckOut]'.

RIG000
یک شنبه 11 آبان 1393, 21:09 عصر
اون دستور سام رو که نوشته بودم بخاطر این بود که برای شما مقدار های تراکنش های هر یوزر رو جمع کنه و نشون بده ...
چرا اینجوری استفاده کردی!
sum کار نمیکنه چون ریلیشن شما از user به checkout خورده .... شما sum v رو اینجوری میتونی ببینی
total=check.Users.CheckOut.Sum()
اما تو سام باید بگی چی میخایکه من تراکنش های هر شخص رو برات یک جا جکع زدم و نشون دادم.
مورد سومی شما هم به _AnonymousType5 داده های ناشناس لینک اشاره داره .... با pagelist کار نکردم اما شما داری مقداری غیر مدل به ویو خودت پاس میدی.

sunn789
یک شنبه 11 آبان 1393, 23:02 عصر
متشکر اینکه sum رو اینجوری نوشتم فقط میخواستم بگم نمیشناسه و گر نه میدونستم هنوز ادامه داره ، نتیجه رو تو همین تاپیک مینویسم
اما اگر بخوام با |View Model بنویسم ، باید چه جوری نوشت؟

RIG000
دوشنبه 12 آبان 1393, 00:23 صبح
خواهش میکنم. شما یکی از دوست های اصلی من تو این سایت هستی sun جان. :)
واسه ویو مدلم فکر میکنم شما یه کلاس بنویس بسته به این خروجی خودت و همچنین حالا هر چیز دیگه ای که نیاز داری سپس اینو پاس بریز تو این کلاس ویو مدل وسپس بفرستش واسه ویو

sunn789
دوشنبه 12 آبان 1393, 17:22 عصر
خوب تا اینجا نمایش و جمع درست شد اما به ازای هر تراکنش کاربر رو هم نشون میده یعنی جمع حساب کاربر میشه 200000 تومان و این به خاطر جمع کردن 150000 و 50000 تومن بوده ، تا اینجا درست اما دوبار توی جدول کاربر رو نشون میده و هر دوبار مبلغ 200000 تومن رو جلوی اسمش نشون میده .
این هم کد ، البته از viewModel استفاده کردم چون باید PagedList رو هم درست میکردم
var checkOuts =
db.CheckOuts.Select(check =>
new CheckOutIndexViewModel()
{
Creditor = check.Users.CheckOuts.Sum(x => x.Creditor)
,
Debtor = check.Users.CheckOuts.Sum(x => x.Debtor)
,
ApplicationUserId = check.ApplicationUserId
,
UserFname = check.Users.FName
,
UserLname = check.Users.Lname
}).Where(x=>x.UserLname.Contains(q)|| q == null)
.OrderBy(x => x.UserLname);

RIG000
دوشنبه 12 آبان 1393, 20:02 عصر
سوالتو نفهمیدم اخرش مجبور شدم دوباره پیادش کنم.
:اشتباه:

DatabaseEntitis db= new DatabaseEntitis(); var checkOuts =
db.Products.Select(
check => new CheckOutIndexViewModel()
{
Creditor = check.User.Products.Sum(x => x.ProductPrice)
,
Debtor = check.User.Products.Sum(x => x.SubTotal)
,
ApplicationUserId = check.PersonalId
,
UserFname = check.User.PersonUserName
,
UserLname = check.User.Email

}

).Distinct();

RIG000
دوشنبه 12 آبان 1393, 20:27 عصر
مشکل شما با
.Distinct(); حل میشه یعنی

sunn789
دوشنبه 12 آبان 1393, 20:41 عصر
خیلی خیلی متشکر تا اینجا با این مشکل حل شده اما هنوز چک نکردم اگر روی جزئیات تراگنس کلیک کنم چی بهم میده
public ActionResult Index(string q, int? page, string currentFilter)
{
if (q != null)
{
page = 1;
}
else
{
q = currentFilter;
}

ViewBag.CurrentFilter = q;
var items = db.CheckOuts.ToArray();
var checkOuts =
db.CheckOuts.Select(check =>
new CheckOutIndexViewModel()
{
Creditor = check.Users.CheckOuts.Sum(x => x.Creditor)
, Debtor = check.Users.CheckOuts.Sum(x => x.Debtor)
, ApplicationUserId = check.ApplicationUserId
,UserFname = check.Users.FName
, UserLname = check.Users.Lname
}).Where(x=>x.UserLname.Contains(q)|| q == null).Distinct()
//.GroupBy(x=>x.ApplicationUserId)
.OrderBy(x => x.UserLname);
//var checkOuts = from t in db.CheckOuts
// where t.Users.Lname.Contains(q)
// orderby t.Users.Lname
// select new {creadator = t};

const int pageSize = 25;
int pageNumber = (page ?? 1);

if (Request.IsAjaxRequest())
{
return PartialView("_Index", checkOuts.ToPagedList(pageNumber, pageSize));
}
return View(checkOuts.ToPagedList(pageNumber, pageSize));
}

sunn789
یک شنبه 25 آبان 1393, 00:40 صبح
نه .Distinct() جواب نداد ،
یعنی هنوز از هر کاربر به تعداد تراکنشهاش توی جدول نام کاربر رو دارم در صورتی که فقط میخوام یه دونه داشته باشم که اون هم جمع کل تراکنشهاش باشه

RIG000
دوشنبه 26 آبان 1393, 21:34 عصر
DatabaseEntitis db = new DatabaseEntitis(); var checkOuts =
db.Products.Select(
check => new CheckOutIndexViewModel()
{
Creditor = check.User.Products.Sum(x => x.ProductPrice)
,
Debtor = check.User.Products.Sum(x => x.SubTotal)
,
ApplicationUserId = check.PersonalId
,
UserFname = check.User.PersonUserName
,
UserLname = check.User.Email


}


).Distinct();


var checkOuts1 =
db.Products.Select(
check => new CheckOutIndexViewModel()
{
Creditor = check.User.Products.Sum(x => x.ProductPrice)
,
Debtor = check.User.Products.Sum(x => x.SubTotal)
,
ApplicationUserId = check.PersonalId
,
UserFname = check.User.PersonUserName
,
UserLname = check.User.Email


}


);
این دقیقا داره کار میکنه - یعنی با همون distinct مشکلت حل میشه فقط شما باید یه کاری کنی و اونم اینه که اون where رو حذف کن ببین میشه! چون من از اولش با where مشکل داشتم تو برنامت.
در ضمن هر چند که باید اینجوری جواب بده. یه بریک پوینت بزن و دیتای دریافتیتو کاملا چک کن. به هیچ وجه نمیشه دو بار لود کنه!
از خروجیت هم به عکس بذار ببینم تا ببینم چطور داره دوباره نشون میده یک یوزر رو!