PDA

View Full Version : سوال: فراخوانی اطلاعات



aroshanzamir
دوشنبه 06 بهمن 1393, 10:47 صبح
سلام دوستان :
من توی یک صفحه یک لیست از کالاها را دارم که کاربر می تونه یک تعدادش را انتخاب کنه ... برای محاسبه قیمت چند کالای انتخاب شده به چه طریق باید عمل کنم :
اگر Id تمام کالاهای انتخاب شده را بفرستم باید به ازای هر رکورد یک selct بزنم که اصلا فکرش هم نمیشه کرد شاید 50 کالا انتخاب کند
اگر Id و Price را بفرستم چطوره ؟

یک راه حل می خواستم :
سپاس از همه شما ها

Felony
دوشنبه 06 بهمن 1393, 15:49 عصر
به ازای هر رکورد باید یک select بزنی ؟! منظورتون اینکه به ازای هر ID باید یک Select بزنی ؟! چرا باید همچین کاری کنی ؟

شما خیلی راحت میتونی ID کالاهای انتخاب شده رو بفرستی و بعد هم رو قیمتشون یه Sum بزنی ؛


Linq

var selectedIds = new[] {1, 2, 7};
var sum = dbContxt.Stuff.Where(w => selectedIds.Contains(w.ID)).Sum(s => s.Price);



SQL

SELECT SUM(Price) FROM [Stuff] WHERE ID IN (1,2,7)

aroshanzamir
دوشنبه 06 بهمن 1393, 19:51 عصر
بینهایت سپاسگزارم از اینکه وقت گذاشتید و پاسخ دادید..

اینو در نظر بگیرید :


public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}



List<Student> Lst1 = new List<Student>()
{
new Student { Id=1, Name="Reza"},
new Student { Id=2, Name="Milad"},
new Student { Id=3, Name="Javad"},
};
List<Student> Lst2 = new List<Student>()
{
new Student { Id=1, Name="Reza"},
new Student { Id=2, Name="Milad"},
new Student { Id=3, Name="Javad"},
new Student { Id=4, Name="Majid"},
new Student { Id=5, Name="ANDY"},
new Student { Id=6, Name="Darush"}
};


حالا اگر قصد بازیابی اطلاعاتی از لیست Lst2 را داشته باشم که در Lst1 وجود ندارند .. اینجا چطور باید عمل کرد ؟
با روش توضیحی خود شما اگر مخالف نباشد این می شود :


var result = Lst2.Where(x => Lst1.Select(w => w.Id).Contains(x.Id)).ToList();


این رکورد های را بازگشت میدهد که Id آنها برابر باشد ...
در ضمن اگر قصد مقایسه بیش از یک فیلد را داشته باشیم چکار باید بکنیم :


ممنون

Felony
سه شنبه 07 بهمن 1393, 21:51 عصر
حالا اگر قصد بازیابی اطلاعاتی از لیست Lst2 را داشته باشم که در Lst1 وجود ندارند .. اینجا چطور باید عمل کرد ؟


var minus = lst2.Where(x => ! lst1.Select(w => w.Id).Contains(x.Id)).ToList();



در ضمن اگر قصد مقایسه بیش از یک فیلد را داشته باشیم چکار باید بکنیم

var minus = lst2.Where(x => !lst1.Select(w => new { w.Id, w.Name }).Contains(new { x.Id, x.Name })).ToList();