راهنمایی برای دستورات linq
باسلام خدمت دوستان.
من نوع فاکتور رو در برنامه ام با عدد ذخیره کردم.مثلا فاکتور خرید با 1 و فروش با 2 و... حالا درفرم لیست فاکتور ها میخوام جستجو رو براساس فیلدهایی مثل تاریخ ثبت فاکتور، نوع فاکتور و... انجام بدم. دستور سرچ رو با linq نوشتم.حالا میخوام بجای عدد در ستون نوع فاکتور بجای 1 بزنه "خرید" و... ولی نمیدونم تو دستور linq چجوری اینو بهش بگم. ممنون میشم راهنمایی بفرمایید
دستور linq من :
var search = from p in context.factors where p.datemiladi >= dt1 && p.datemiladi <= dt2 || p.typefactor.ToString().Contains(this.comfactor.Text.Trim()) select new { p.creatdate, p.typefactor, p.factornumber, p.sumfactor, p.cash, p.balanceprice, p.accountcode, p.accountnamef }; dgvfactorlist.DataSource = search;
17 پاسخ
شما الان دارید از SP ایجاد شده استفاده می کنید و داخل SP هیچ شرطی نذاشتید. یعنی کوئری sp شما بخش where نداره.
ممنونم.تست میکنم.
لطف کردید
خواهش میکنم. بله درست شد.حالا اگه بخوام حالت های دیگه اش رو بنویسم چجوری باید جداشون کنم؟
مثلا بخوام در ادامه اش بگم 2 بود بزنه فروش و ...
با سلام.
یه مشکلی پیش اومده.من تو جدول فاکتور فیلد جمع فاکتور(sumfactor) رو bigint تعریف کردم.تو کلاسی که شما گفتین تعریف کنم نوع متغیری که قراره فیلد sumfactor توش قراربگیره رو long و یک بار دیگه INT64 تعریف کردم.اما بازم خطا میده.
تعریف کلاس به این صورته:
public class FactorModel { public string crdate { get; set; } public long factnumber { get; set; } public Int64 sumfact { get; set; } public Int64 cashamount { get; set; } public Int64 balance { get; set; } public Int64 acccode { get; set; } public string accnamef { get; set; } public string typefactor { get; set; } public string typefactortext { get { switch (typefactor) { case "1": return "خرید"; case "2": return "فروش"; case "3": return "مرجوعی خرید"; case "4": return "مرجوعی فروش"; } return "نامشخص"; } } }
و در قسمت دکمه جستجو هم این کد:
select new FactorModel { crdate= p.creatdate, typefactor= p.typefactor , factnumber= p.factornumber, sumfact = p.sumfactor, cashamount= p.cash, balance= p.balanceprice, acccode = p.accountcode, accnamef=p.accountnamef, });
وخطایی که میده اینه:
Cannot implicitly convert type 'long?' to 'long'. An explicit conversion exists (are you missing a cast?)
جالبه این خطارو برای factornumber که اونم تو جدول از نوع bigint هست نمیده!!! ولی برای accountcode که int تعریف شده وتو کلاس متغیرشو از نوع long یا INT64 تعریف میکنم، بازم خطا داره
من در قسمت load فرم این دستورات رو نوشتم و دیتاگرید رو با پروسیجر پر کردم:
dgvfactorlist.DataSource = context.factorslist(); dgvfactorlist.Columns[0].HeaderText = "تاریخ ثبت"; dgvfactorlist.Columns[1].HeaderText = "نوع فاکتور"; dgvfactorlist.Columns[2].HeaderText = "شماره فاکتور "; dgvfactorlist.Columns[3].HeaderText = "جمع فاکتور "; dgvfactorlist.Columns[4].HeaderText = "مبلغ نقدی"; dgvfactorlist.Columns[5].HeaderText = "مبلغ مانده"; dgvfactorlist.Columns[6].HeaderText = "کد حساب"; dgvfactorlist.Columns[7].HeaderText = "نام حساب";
سلام، شما به صورت زیر کوئری رو تغییر بدید تا خروجی مورد نظرتون رو بگیرید:
var search = from p in context.factors where p.datemiladi >= dt1 && p.datemiladi <= dt2 || p.typefactor.ToString().Contains(this.comfactor.Text.Trim()) select new { p.creatdate, p.typefactor == 1 ? "خرید" : "فروش", p.factornumber, p.sumfactor, p.cash, p.balanceprice, p.accountcode, p.accountnamef }; dgvfactorlist.DataSource = search;
خطا داره.این متن خطاش هست:
Invalid anonymous type member declarator. Anonymous type members must be declared with a member assignment, simple name or member access.
یکبار Bind ستون های DataGrid رو چک کنید با مدل ببینید با مشکلی نداره؟ کدی نهایی که نوشتید رو هم بزارید تا ببینیم دلیل فیلتر نشدن اطلاعات چیه.
نوع typefactor در جدول nvarchar هستش که من بجای 1 گذاشتم '1'
عذر خواهی می کنم، باید برای typefactor یک نام مشخص کنید:
var search = from p in context.factors where p.datemiladi >= dt1 && p.datemiladi <= dt2 || p.typefactor.ToString().Contains(this.comfactor.Text.Trim()) select new { p.creatdate, typefactor = p.typefactor == "1" ? "خرید" : "فروش", p.factornumber, p.sumfactor, p.cash, p.balanceprice, p.accountcode, p.accountnamef }; dgvfactorlist.DataSource = search;
خطاش رفع شد ولی متاسفانه تو دیتا گرید اینجوری نشون میده:
همه چی جابجا میشه و درست نمیزنه. مشکل دیگه اینه که من فقط خرید رو انتخاب میکنم، فقط باید فاکتورهای خرید رو بیاره اما همش رو میاره...
سلام مجدد، احتمالاً ستون مورد نظرتون رو داخل بانک اطلاعاتی Nullable تعریف کردید، اما داخل Model از نوع Nullable نیست، long رو nullable تعریف کنید مشکل حل میشه احتمالاً.
شما از factors دارید کوئری می گیرید و جایی تو کد ندیدم که SP رو فراخوانی کنید. اگر ستون ها رو به صورت دستی مشخص می کنید باید برای DataGridView خصوصیت AutoGenerateColumns رو باید غیرفعال کنید و ستون ها رو به صورت دستی اضافه کنید، در غیر اینصورت به صورت خودکار آیتم ها داخل گرید نمایش داده میشن. هر مشکلی هست از سمت DataGridView هست «به احتمال زیاد»!
من پیشنهاد می کنم یک کلاس تعریف کنید که آیتم های مورد نظرتون رو داشته باشه:
public class FactorModel { // fields public string typefactor {get;set;} }
و از این کلاس برای ایجاد خروجی استفاده کنید:
var search = from p in context.factors where p.datemiladi >= dt1 && p.datemiladi <= dt2 || p.typefactor.ToString().Contains(this.comfactor.Text.Trim()) select new FactorModel { p.creatdate, typefactor = p.typefactor == "1" ? "خرید" : "فروش", p.factornumber, p.sumfactor, p.cash, p.balanceprice, p.accountcode, p.accountnamef };
حالا داخل همون کلاس FactorModel یک خصوصیت تعریف کنید با نام typefactortext که به صورت زیر تعریف میشه و خروجی رو به صورت text و بر اساس مقدار typefactor بر میگردونه و این خصوصیت رو برای bind کردن استفاده کنید:
public class FactorModel { public string typefactor {get;set;} public string typefactortext { get { switch(typefactor) { case "1": return "خرید"; case "2": return "فروش"; } return "نامشخص"; } } }
باسلام.
من این دستورات رو برای پرکردن دیتاگرید گذاشتم.لطف میکنید بررسی کنید مشکل چیه.
بسیار ممنون
باسلام مجدد.نه ، من در sp شرط نذاشتم.چون دیتاگرید در لود فرم پر میشه و هنوز جستجویی براساس فیلد مشخص صورت نگرفته، بنابراین باید همه اطلاعات رو نشون بده
باعرض سلام مجدد.من برای پرکردن دیتاگرید از پروسیجر زیر استفاده کردم:
ALTER proc factorslist as select factor.creatdate as 'تاریخ ثبت',case factor.typefactor when 1 then N'خرید' when 2 then N'فروش' when 3 then N'مرجوعی خرید' when 4 then N'مرجوعی فروش' end as N'نوع فاکتور',factor.factornumber as ' شماره فاکتور',factor.sumfactor as 'مبلغ کل فاکتور ',factor.cash as ' مبلغ نقدی', factor.balanceprice as 'مانده فاکتور',factor.accountcode as 'کد حساب معین',factor.accountnamef as 'نام حساب معین' from factor
که تو دستور جستجو هم دقیقا به همین ترتیب فیلدهارو گذاشتم