PDA

View Full Version : نوشتن این کوئری با EF



csharpprogramer88
دوشنبه 04 شهریور 1392, 23:34 عصر
سلام

با فرض اینکه یک جدول بنام جدول خرید کالا و یک جدول جدا به نام جدول طرف جساب داریم که در جدول خرید کالا اطلاعات خرید کالا ذخیره میشود و در جدول طرف حساب اطلاعات طرف حساب (کسی که از اون کالا خریده ایم)

یکی از فیلد های جدول طرف حساب ، نام طرف حساب میباشد . و یکی از فیلدهای جدول کالا ، شماره فاکتور خرید ،

حال چطوری میتونم با این 2 فیلد ، نام طرف حساب را بدست بیارم؟

مثلا اگه شماره فاکتور خرید 12 بود ، بگه فاکتور 12 برای آقای میرزاییان می باشد ؟

آیا باید از ویو استفاده شود؟

Direlap
دوشنبه 04 شهریور 1392, 23:56 عصر
به نظرم اگه بتونید عکسی از موجودیت هاتون رو اینجا قرار بدید راحت تر بشه کمک کرد.

csharpprogramer88
سه شنبه 05 شهریور 1392, 08:16 صبح
در جدول خرید فیلد id_group_factorkharid کلید خارجی از جدول گروه خرید هست (فیلد id)

در جدول گروه خرید فیلد id_tarafhesab کلید خارجی از جدول طرف حساب می باشد

حالا چه کوئری بنویسم تا اگر کاربر id_group_factorkharid را 12 زد ، نام طرف حساب آنرا بر گردانم؟

gilas1368
سه شنبه 05 شهریور 1392, 08:50 صبح
باید سه تا table رو با هم Jion کنین
و شرطتون هم این باشه ک اگ id جدول طرف حسابتون 12 بود نامش رو برگردونه

csharpprogramer88
سه شنبه 05 شهریور 1392, 08:52 صبح
نیاز نیست از ویو استفاده کنم؟

gilas1368
سه شنبه 05 شهریور 1392, 08:54 صبح
نه
با ی jion ساده کارتون راه میوفته
البته این نظر منه

csharpprogramer88
سه شنبه 05 شهریور 1392, 08:57 صبح
پس ویو ها در کجا کاربرد داره؟

aliasghar2
سه شنبه 05 شهریور 1392, 10:40 صبح
سلام این کمکت میکنه
Select Name_TarafHesab=(Select Name From Tarafhesab where ID =(Select Id_tarafhesab from group_kharid where id =(select id_factorKharid from kharid where id =adadedelkhah)

gilas1368
سه شنبه 05 شهریور 1392, 10:43 صبح
اینم تابع Join دوتا Table ک خروجیش ی لیست از نوع کلاسه

امیدوارم مفید باشه


public List<UserMemberOfInfo> GetMemberOfUser(int userId)
{
using (var db=new ERP_Main())
{
var result = from userRole in db.UserRoles
join role in db.Roles on userRole.Role_Id equals role.Role_Id
where userRole.User_Id == userId && role.Removed == false
select new UserMemberOfInfo()
{
RoleId = role.Role_Id,
Name = role.Name,
Description = role.Description
};

return result.ToList();
}

csharpprogramer88
سه شنبه 05 شهریور 1392, 11:51 صبح
اینم تابع Join دوتا Table ک خروجیش ی لیست از نوع کلاسه

امیدوارم مفید باشه


public List<UserMemberOfInfo> GetMemberOfUser(int userId)
{
using (var db=new ERP_Main())
{
var result = from userRole in db.UserRoles
join role in db.Roles on userRole.Role_Id equals role.Role_Id
where userRole.User_Id == userId && role.Removed == false
select new UserMemberOfInfo()
{
RoleId = role.Role_Id,
Name = role.Name,
Description = role.Description
};

return result.ToList();
}


میشه توضیح بدید داره چیکارا انجام میشه

csharpprogramer88
سه شنبه 05 شهریور 1392, 12:31 عصر
اینم تابع Join دوتا Table ک خروجیش ی لیست از نوع کلاسه

امیدوارم مفید باشه


public List<UserMemberOfInfo> GetMemberOfUser(int userId)
{
using (var db=new ERP_Main())
{
var result = from userRole in db.UserRoles
join role in db.Roles on userRole.Role_Id equals role.Role_Id
where userRole.User_Id == userId && role.Removed == false
select new UserMemberOfInfo()
{
RoleId = role.Role_Id,
Name = role.Name,
Description = role.Description
};

return result.ToList();
}




userRole چیه؟

Direlap
سه شنبه 05 شهریور 1392, 13:07 عصر
شما یک کوئری شبیه به این نیاز دارید :


var query = (from p in kharid
join n in goruhkharid on p.id_group_factorkharid equals n.id_tarafhesab into pn
where pn.id_group_factorkharid == 12
from c in pn
join d in tarafhesab on c.id_tarafhesab equals d.id
select new {d.name_tarafhesab}).Single();

gilas1368
سه شنبه 05 شهریور 1392, 13:20 عصر
userRole چیه؟

UserRoler اسم جدول منه
Role هم همینطور

csharpprogramer88
سه شنبه 05 شهریور 1392, 13:49 عصر
شما یک کوئری شبیه به این نیاز دارید :


var query = (from p in kharid
join n in goruhkharid on p.id_group_factorkharid equals n.id_tarafhesab into pn
where pn.id_group_factorkharid == 12
from c in pn
join d in tarafhesab on c.id_tarafhesab equals d.id
select new {d.name_tarafhesab}).Single();


join n in goruhkharid

منظور از n چیه؟

Direlap
سه شنبه 05 شهریور 1392, 14:11 عصر
join n in goruhkharid

منظور از n چیه؟

n یک متغیری هست که ما خودمون اسمشو تعیین میکنیم و هدف از به کار بردنش مثل ایجاد نمونه ای از یه جدوله.

در اینجا n رو میسازیم از یک جدول به نام goruhkharid تا به فیلد های اون جدول دسترسی داشته باشیم.

مهرداد صفا
سه شنبه 05 شهریور 1392, 14:42 عصر
با سلام.
با فرض اینکه یک پایگاه داده به نام JoinTest روی سرور وجود دارد؛ کد زیر یک جدول به نام costomer با دو فیلد id و name و یک جدول به نام facter با دو فیدل id و costomerId روی آن ایجاد می کند. در اولین query نام costomerی که مربوط به facterشماره 1 است گرفته و نمایش داده می شود و در ادامه یک view برای نمایش شماره فاکتور و نام مشتری مربوطه ساخته می شود:

//in the name of god
//اللهم صل علی محمد و آل محمد

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.VisualBasic;
using System.Data.SqlClient;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

SqlConnection connection =new SqlConnection(@"server=.\sqlexpress;integrated security=true;database=jointest;");
SqlCommand Command = new SqlCommand("", connection);
connection.Open();
Action<string> execute =(string sql) => { Command.CommandText = sql; Command.ExecuteNonQuery(); };
execute("if(exists(select name from sys.tables where name='costomer')) drop table costomer;");
execute("if(exists(select name from sys.tables where name='factor')) drop table factor;");
execute("create table costomer(id int identity,name nvarchar(50))");

execute( "create table factor (id int identity,costomerID int)");

execute("insert into costomer values('costomer1')");

execute( "insert into factor values (1)");
execute("insert into costomer values('costomer2')");
execute("insert into factor values(2)");
Command.CommandText = "select cost.name from dbo.costomer cost join dbo.factor fact on cost.id=fact.costomerID where fact.id=1";

SqlDataReader reader = Command.ExecuteReader();
reader.Read();
MessageBox.Show(reader[0].ToString());
reader.Close();
execute("if(exists(select name from sys.views where name='view1')) drop view view1;");
execute("create view view1 as select cost.name, fact.id FactorId from costomer cost join factor fact on cost.id=fact.costomerID");
Command.CommandText=("select * from view1");

dataGridView1.DataSource =new DataTable();
(dataGridView1.DataSource as DataTable).Load(Command.ExecuteReader());
connection.Close();

}
}
}


اگر همین پایگاه داده را با دو جدول گفته شده به صورت entity model داشته باشیم و بخواهیم costomer مربوط به factor شماره یک را بگیریم به این صورت عمل می کنیم:

JoinTestEntities dbo = new JoinTestEntities();
string costomerName = (from cost in dbo.costomers join fact in dbo.factors on cost.id equals fact.costomerID where fact.id == 1 select cost.name).First();
MessageBox.Show(costomerName);

khokhan
سه شنبه 05 شهریور 1392, 19:36 عصر
سلام

با فرض اینکه یک جدول بنام جدول خرید کالا و یک جدول جدا به نام جدول طرف جساب داریم که در جدول خرید کالا اطلاعات خرید کالا ذخیره میشود و در جدول طرف حساب اطلاعات طرف حساب (کسی که از اون کالا خریده ایم)

یکی از فیلد های جدول طرف حساب ، نام طرف حساب میباشد . و یکی از فیلدهای جدول کالا ، شماره فاکتور خرید ،

حال چطوری میتونم با این 2 فیلد ، نام طرف حساب را بدست بیارم؟

مثلا اگه شماره فاکتور خرید 12 بود ، بگه فاکتور 12 برای آقای میرزاییان می باشد ؟

آیا باید از ویو استفاده شود؟
این کوئری برای دریافت اطلاعات:

db_gannadiEntities2 context = new db_gannadiEntities2();
var serv = (from s in context.tbl_kharid
join sa in context.tbl_tarafhesab on s.id_group_factorkharid equals sa.id
where sa.id == 1
select s).ToList();
dataGridView1.DataSource = serv;
واین هم فرم بعد از واکشی اطلاعات:
109792

khokhan
سه شنبه 05 شهریور 1392, 19:53 عصر
البته چون امکان ارسال مستقیم نتیجه کوئری به گزارش نیست لذا ابتدا یه دیتاست از نتیجه کوری تشکیل بدین و بعد دیتا تیبل موجود در درون این دیتاست رو به گزارش ارسال کنین :

اینطوری

private void button1_Click(object sender, EventArgs e)
{

DataSet ds = new DataSet();
DataSet1.ganadiDataTable tb = new DataSet1.ganadiDataTable();
db_gannadiEntities2 context = new db_gannadiEntities2();
var serv = (from s in context.tbl_kharid
join sa in context.tbl_tarafhesab on s.id_group_factorkharid equals sa.id
where sa.id == 1
select s).ToList();
foreach (tbl_kharid item in serv)
{
tb.Rows.Add(item.id, item.id_group_factorkharid, item.meghdarkharid, item.namekala,item.fee);
}
if (serv == null)
{
MessageBox.Show("null");
}
else
{
DataSet Ds = new DataSet();
Ds.Tables.Add(tb);
Stimulsoft.Report.StiReport stiReport1 = new Stimulsoft.Report.StiReport();
stiReport1.Load(System.Windows.Forms.Application.S tartupPath + @"\stirpt.mrt");
stiReport1.RegData(tb);
stiReport1.Compile();
stiReport1.Design();
stiReport1.Show();

}
}

این هم از گزارش با استیمول از همون کوئری جوین شده

109794