PDA

View Full Version : سوال: قرار دادن چند شرط در Linq Select



ashkan1234
دوشنبه 19 آبان 1393, 17:14 عصر
با سلام.
کسی اطلاع داره توی یه select از لینک چطوری میشه چند شرط گذاشت؟
مثلا با دوشرط من از شرط سه عملوندی استفاده میکنم!
مثه این:
var recive= db.TBL_Receivers.ToList().Select((c, index) => new {
RowIndex = index + 1,
c.Id,
Reciver = c.Receiver,
c.Username,
ReciverStatus = c.TBL_Senders.OrderByDescending(d=> d.Id).First().Status==1 ? "Valid" : "Invalid"


});
gridShow.DataSource = recive;

ولی اگر بخوام توی این select بالا از چند تا شرط استفاده کنم چجوری بایستی عمل کنم؟
از foreach نمیخوام استفاده کنم!
آیا روشی برای اینکار دارید؟
شرط رو اینجوری در نظر بگیرید؟
if(c.TBL_Senders.OrderByDescending(d=> d.Id).First().Status==1)ReciverStatus=Ok;else if(c.TBL_Senders.OrderByDescending(d=> d.Id).First().Status==2)ReciverStatus=Valid;
else if(c.TBL_Senders.OrderByDescending(d=> d.Id).First().Status==3)ReciverStatus=Invalid;

else ReciverStatus=Empty;
با تشکل!:لبخند:

lovee20002002
دوشنبه 19 آبان 1393, 19:50 عصر
ReciverStatus = (c.TBL_Senders.OrderByDescending(d=> d.Id).First().Status>1 ?(c.TBL_Senders.OrderByDescending(d=> d.Id).First().Status>2?"Invalid":"Valid"):"ok"

مهرداد صفا
دوشنبه 19 آبان 1393, 20:14 عصر
سلام.
راه که زیاد دارید ولی چندتاش:
1- مقادیر خروجی رو داخل آرایه بریزید و از مقدار ورودی به عنوان اندیس استفاده کنید!:


ReciverStatus =(new string() {"OK","valid","invalid"})[ c.TBL_Senders.OrderByDescending(d=> d.Id).First().Status]...
2- از تابع Microsoft.VisualBasic.Interaction.Choose استفاده کنید:


ReciverStatus =Microsoft.VisualBasic.Interaction.Choose( c.TBL_Senders.OrderByDescending(d=> d.Id).First().Status,"OK","valid","invalid")
فراموش نکنید که کتابخونه Microsoft.VisualBasic رو reference کنید.
در هر دو مورد می تونید به راحتیelse رو هم پیاده کنید:


result=value>2?"elseValue":Choose(value,"v1","v2","v3")...

3- تنبلی رو بگذارید کنار و با یک extension method یکبار برای همیشه خودتون رو راحت کنید:


public static partial class Class1
{
namespace MyNamespace
public static object Choose<T> ( this T v1,object elseValue, params object[] values) where T:IEquatable<T>
{
for (int i = 0; i < values.Length; i += 2)
if (((T)values[i]).Equals( v1))
return values[i + 1];
return elseValue;
}
}
}

...

using MyNamespace
...
ReciverStatus =c.TBL_Senders.OrderByDescending(d=> d.Id).First().Status.Choose("elseValue",0,"OK",1,"valid",2,"invalid")...