View Full Version : سوال: نمایش تمام اطلاعات جدول اصلی بعد از ساخت View از چند جدول یا استفاده از Linq
ashkan1234
پنج شنبه 23 خرداد 1392, 23:32 عصر
با سلام!
دوستان یه سوالی حیاطی برام پیش اومده!
فرض کنید 3تا جدول دارم!
1-جدول پرسنل
2-جدول بانک
3-جدول سمت
جدول پرسنل جدول اصلی منه!
جدول بانک زیر مجموعه پرسنله!
جدول سمت هم پدر جدول پرسنل میشه!
حالا چه من View میزنم چه از تو سی شارپ با دستورات LINQ جدول رو به گرید وصل میکنم یه مشکل بزرگی دارم!
اونم اینکه:فقط اون پرسنلی رو نمایش میده که براشون بانک در نظر گرفته شده!
و اونایی که بانک ندارن رو تو گرید ویو نمیاره!
خیلی گیرم لطفا راهنمایی بفرمایید!
اول با Linq رفتم دیدم اینجوریه،گفتم بزار View بزنم شاید درسته بشه،ولی هیچ تفاوتی نمیکنه!
من میخوام تو گرید همه پرسنل رو نمایش بده و اونایی که بانک ندارن،فیلد بانکشون در گرید خالی باشه و سایر اطلاعاتتشون نمایش داده بشه.اونایی هم که بانک دارن، به همراه سایر اطلاعاتشون،بانکشون هم نمایش داده بشه!
چکار کنم؟؟؟؟؟؟؟؟؟؟؟؟؟
private void FillGridPersonel()
{
using (var db = new PayrollDataContext())
{
var BNK = db.TBLBankAccounts.ToList();
if (BNK.Count == 0) return;
var result = BNK.Select((f) => new
{
IdPers = f.TBLPersonnel.Id,
HomeTell = f.TBLPersonnel.HomeTell,
NationalId = f.TBLPersonnel.NationalId,
CellPhone = f.TBLPersonnel.CellPhone,
CapPost = f.TBLPersonnel.TBLPost.Caption,
f.AccountNumber,
Fullname = f.TBLPersonnel.Fname + " " + f.TBLPersonnel.Lname
}).ToList();
gridPersonnel.DataSource = result;
}
}
Mahmoud.Afrad
جمعه 24 خرداد 1392, 04:58 صبح
باید در View از Outer joinها استفاده کنید.(left outer join , right outer join , full outer join بسته به نیازتون).
ashkan1234
شنبه 25 خرداد 1392, 10:06 صبح
باید در View از Outer joinها استفاده کنید.(left outer join , right outer join , full outer join بسته به نیازتون).
ممنونم از راهنماییتون!
یعنی توی کدهای ویو بجای inner ها outer بزنم؟!درست متوجه شدم؟
اگه ممکنه تفاوت Full و Right و Left رو بفرمایید !متشکرم!
ashkan1234
شنبه 25 خرداد 1392, 18:41 عصر
راستی یه مشکل دیگه وقتی OUTER JOIN میزنم یه اشکالی ایجاد میشه:
فرض کنید یه پرسنل 3تا شماره حساب داره!
با این دستور این میره 3 بار یه پرسنل رو نمایش میده با سه عدد شماره حساب متفاوت!
در صورتی که میخوام فقط اولین شماره حساب نمایش داده بشه!
چطوری اینکارو کنم؟با Group by میشه؟
ashkan1234
شنبه 25 خرداد 1392, 19:55 عصر
مشکلم حل شد!
با LEFT OUTER JOIN جواب گرفتم:لبخند:
ولی اطلاعات تکراری رو نمیشه با Group by فیلتر کرد!
Mahmoud.Afrad
یک شنبه 26 خرداد 1392, 03:35 صبح
میخوام فقط اولین شماره حساب نمایش داده بشه!
چطوری اینکارو کنم؟با Group by میشه؟
http://stackoverflow.com/questions/1004079/selecting-the-top-n-rows-within-a-group-by-clause
http://archive.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=SelectTopNByGroup
http://barnamenevis.org/showthread.php?210177
ashkan1234
یک شنبه 26 خرداد 1392, 11:53 صبح
لینک ها کمکی بهم نکردند!
Mahmoud.Afrad
دوشنبه 27 خرداد 1392, 09:41 صبح
کوئری View را همراه اسکریپت جدولهایی که در کوئری دخیل هستند بزارید تا تست کنم.
ashkan1234
دوشنبه 27 خرداد 1392, 10:22 صبح
کوئری View را همراه اسکریپت جدولهایی که در کوئری دخیل هستند بزارید تا تست کنم.
SELECT DISTINCT
dbo.Personnel.Id AS IdPers, dbo.Personnel.Fname, dbo.Personnel.Lname, dbo.Personnel.PRS_ShomareGharardad, dbo.Personnel.PRS_MablaghMosaede,
dbo.Personnel.OtherTrust, dbo.Personnel.TrustAmount, dbo.Personnel.GradeId, dbo.Personnel.PostId, dbo.Personnel.CellPhone, dbo.Personnel.HomeTell,
dbo.Personnel.NationalId, dbo.Personnel.IsMan, dbo.Post.Caption AS CapPost, dbo.Grade.Caption AS CapGrade, dbo.BankAccount.AccountNumber,
dbo.Bank.Caption AS CapBank, dbo.BankAccount.PersonnelId
FROM dbo.Bank INNER JOIN
dbo.BankAccount ON dbo.Bank.Id = dbo.BankAccount.BankId RIGHT OUTER JOIN
dbo.Personnel INNER JOIN
dbo.Grade ON dbo.Personnel.GradeId = dbo.Grade.Id INNER JOIN
dbo.Post ON dbo.Personnel.PostId = dbo.Post.Id ON dbo.BankAccount.PersonnelId = dbo.Personnel.Id
WHERE (dbo.BankAccount.PersonnelId IN
(SELECT DISTINCT PersonnelId
FROM dbo.BankAccount AS BankAccount_1))
105681
خیلی خیلی خیلی خیلی ممنوم....:لبخند::لبخند::لبخند: :لبخند::لبخند::قلب::قلب::قلب:
Mahmoud.Afrad
دوشنبه 27 خرداد 1392, 20:46 عصر
WITH cte_t
AS
(
SELECT ROW_NUMBER() over (PARTITION BY Personnel.id order by Personnel.id) AS ROWNUMBER,
dbo.Personnel.Id AS IdPers,
dbo.Personnel.Fname,
dbo.Personnel.Lname,
dbo.Personnel.PRS_ShomareGharardad,
dbo.Personnel.PRS_MablaghMosaede,
dbo.Personnel.OtherTrust,
dbo.Personnel.TrustAmount,
dbo.Personnel.GradeId,
dbo.Personnel.PostId,
dbo.Personnel.CellPhone,
dbo.Personnel.HomeTell,
dbo.Personnel.NationalId,
dbo.Personnel.IsMan,
dbo.Post.Caption AS CapPost,
dbo.Grade.Caption AS CapGrade,
dbo.BankAccount.AccountNumber,
dbo.Bank.Caption AS CapBank,
dbo.BankAccount.PersonnelId
FROM dbo.Bank INNER JOIN
dbo.BankAccount ON dbo.Bank.Id = dbo.BankAccount.BankId
RIGHT OUTER JOIN
dbo.Personnel
INNER JOIN
dbo.Grade ON dbo.Personnel.GradeId = dbo.Grade.Id
INNER JOIN
dbo.Post ON dbo.Personnel.PostId = dbo.Post.Id ON dbo.BankAccount.PersonnelId = dbo.Personnel.Id
WHERE dbo.BankAccount.PersonnelId IN
(SELECT DISTINCT PersonnelId
FROM dbo.BankAccount AS BankAccount_1)
)
SELECT *
FROM cte_t
where cte_t.ROWNUMBER = 1
اینکه اون یک رکورد بر چه اساسی انتخاب بشه در Order by مشخص میشه. میتونی مرتب سازی رو تغییر بدی.
اگر نتونستی در قالب View ذخیره کنی به صورت یک StoredProcedur ذخیره کن.
ashkan1234
دوشنبه 27 خرداد 1392, 21:02 عصر
WITH cte_t
AS
(
SELECT ROW_NUMBER() over (PARTITION BY Personnel.id order by Personnel.id) AS ROWNUMBER,
dbo.Personnel.Id AS IdPers,
dbo.Personnel.Fname,
dbo.Personnel.Lname,
dbo.Personnel.PRS_ShomareGharardad,
dbo.Personnel.PRS_MablaghMosaede,
dbo.Personnel.OtherTrust,
dbo.Personnel.TrustAmount,
dbo.Personnel.GradeId,
dbo.Personnel.PostId,
dbo.Personnel.CellPhone,
dbo.Personnel.HomeTell,
dbo.Personnel.NationalId,
dbo.Personnel.IsMan,
dbo.Post.Caption AS CapPost,
dbo.Grade.Caption AS CapGrade,
dbo.BankAccount.AccountNumber,
dbo.Bank.Caption AS CapBank,
dbo.BankAccount.PersonnelId
FROM dbo.Bank INNER JOIN
dbo.BankAccount ON dbo.Bank.Id = dbo.BankAccount.BankId
RIGHT OUTER JOIN
dbo.Personnel
INNER JOIN
dbo.Grade ON dbo.Personnel.GradeId = dbo.Grade.Id
INNER JOIN
dbo.Post ON dbo.Personnel.PostId = dbo.Post.Id ON dbo.BankAccount.PersonnelId = dbo.Personnel.Id
WHERE dbo.BankAccount.PersonnelId IN
(SELECT DISTINCT PersonnelId
FROM dbo.BankAccount AS BankAccount_1)
)
SELECT *
FROM cte_t
where cte_t.ROWNUMBER = 1
اینکه اون یک رکورد بر چه اساسی انتخاب بشه در Order by مشخص میشه. میتونی مرتب سازی رو تغییر بدی.
اگر نتونستی در قالب View ذخیره کنی به صورت یک StoredProcedur ذخیره کن.
سلام خدا خیرت بده!
تو View جواب نداد ولی توی StoredProcedur بخوبی جواب داد،تشکر فراوان!
فکر نکنم،کسی بخوبی شما میتونست این مشکل رو حل کنه!
نمیدونستم Order by قدرت انتخاب داره واسه همین نتونستم با استفاده از لینکهایی که دادید نتونستم مشکل رو حل کنم!
دستتون درد نکنه!چندتا چیز یاد دادید بهم!:لبخند:
خدا خیرتون بده...:قلب:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.