View Full Version : سوال: کمک در ایجاد یک cte در EF
amir3321
دوشنبه 17 تیر 1392, 19:52 عصر
با سلام
از اساتید محترم تقاضا دارم در مورد تبدیل این کويری کمک فرمایید
CREATE PROCEDURE [BOM].[getchildofparent]
@parentid int,
@productid int
AS
BEGIN
begin tran
SET NOCOUNT ON;
WITH parts AS (SELECT partid, parentid, qtym , typeid
FROM BOM.treepartview
WHERE (parentid = @parentid) or (partid=@parentid) and (productid = @productid)and (productid2 = @productid)
UNION ALL
SELECT e.partid, e.parentid,CAST((e.qtym * d.qtym) AS decimal(9,2)) as qtym , e.typeid
FROM BOM.treepartview AS e INNER JOIN
parts AS d ON e.parentid = d.partid
WHERE (e.productid = @productid)and (e.productid2 = @productid))
SELECT parts_1.partid ,sum(parts_1.qtym)as qty FROM parts AS parts_1
group by parts_1.partid
if @@Error = 0
Commit Tran
Else
Rollback Tran
END
var cf = db.treepartviews.Where(x => x.parentid == 101 )
.Where(x => x.productid == 108 && x.productid2 == 108).Select(x => new { x.partid, x.parentid, x.qtym, x.productid, x.productid2 });
var sd = cf.Concat(from s in db.treepartviews join c in cf on s.parentid equals c.partid select new { s.partid, s.parentid,qtym = s.qtym*c.qtym , s.productid, s.productid2 });
در ef با این قطعه کد فقط دو سطح برگردانده می شود خوا هشمند است اساتید محترم کمک فرمایید
Mahmoud.Afrad
دوشنبه 17 تیر 1392, 21:00 عصر
اسکریپت جداولی که در کوئری هستند رو بزارید. البته توضیح بدید چه خروجی مدنظرتون هست شاید بشه کوئری ساده تری ایجاد کرد.
amir3321
دوشنبه 17 تیر 1392, 22:24 عصر
106898
لیست جداول بصورت بالا می باشد
من می خواهم لیست قطعات زیر مجموعه یک محصول رو تا آخرین سطح بدست بیاورم و تعداد ان ها را بصورت آبشاری بدست بیاورم این cte در sql رو قبلا از جناب بکتاش یاد گرفتم حالا می خوام این کوئری رو تو ef با linq اماده کنم
amir3321
سه شنبه 18 تیر 1392, 22:38 عصر
با سلام یادم رفته بود اینم اسکریپت جداول
USE [siepdb910104]
GO
/****** Object: Table [BOM].[parttype] Script Date: 07/09/2013 23:16:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [BOM].[parttype](
[id] [int] IDENTITY(100,1) NOT NULL,
[descfa] [nvarchar](50) NULL,
[descen] [varchar](50) NULL,
CONSTRAINT [PK_parttype] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [BOM].[part] Script Date: 07/09/2013 23:16:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [BOM].[part](
[id] [int] IDENTITY(100,1) NOT NULL,
[dwgno] [nvarchar](50) NOT NULL,
[descfa] [nvarchar](100) NULL,
[typeid] [int] NOT NULL,
[descen] [varchar](100) NULL,
[ins_user] [int] NULL,
[ins_date] [datetime] NULL,
[upd_user] [int] NULL,
[upd_date] [datetime] NULL,
CONSTRAINT [PK_part] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [BOM].[treepart] Script Date: 07/09/2013 23:16:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [BOM].[treepart](
[partid] [int] NOT NULL,
[parentid] [int] NOT NULL,
[qtym] [decimal](9, 2) NULL,
CONSTRAINT [PK_treepart] PRIMARY KEY CLUSTERED
(
[partid] ASC,
[parentid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [BOM].[partlinkproduct] Script Date: 07/09/2013 23:16:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [BOM].[partlinkproduct](
[partid] [int] NOT NULL,
[productid] [int] NOT NULL,
[active] [bit] NULL,
CONSTRAINT [PK_partlinkproduct] PRIMARY KEY CLUSTERED
(
[partid] ASC,
[productid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: ForeignKey [FK_part_parttype] Script Date: 07/09/2013 23:16:53 ******/
ALTER TABLE [BOM].[part] WITH CHECK ADD CONSTRAINT [FK_part_parttype] FOREIGN KEY([typeid])
REFERENCES [BOM].[parttype] ([id])
GO
ALTER TABLE [BOM].[part] CHECK CONSTRAINT [FK_part_parttype]
GO
/****** Object: ForeignKey [FK_part_sysuser] Script Date: 07/09/2013 23:16:53 ******/
ALTER TABLE [BOM].[part] WITH CHECK ADD CONSTRAINT [FK_part_sysuser] FOREIGN KEY([ins_user])
REFERENCES [GNR].[sysuser] ([personid])
GO
ALTER TABLE [BOM].[part] CHECK CONSTRAINT [FK_part_sysuser]
GO
/****** Object: ForeignKey [FK_part_sysuser1] Script Date: 07/09/2013 23:16:53 ******/
ALTER TABLE [BOM].[part] WITH CHECK ADD CONSTRAINT [FK_part_sysuser1] FOREIGN KEY([upd_user])
REFERENCES [GNR].[sysuser] ([personid])
GO
ALTER TABLE [BOM].[part] CHECK CONSTRAINT [FK_part_sysuser1]
GO
/****** Object: ForeignKey [FK_partlinkproduct_part] Script Date: 07/09/2013 23:16:53 ******/
ALTER TABLE [BOM].[partlinkproduct] WITH CHECK ADD CONSTRAINT [FK_partlinkproduct_part] FOREIGN KEY([partid])
REFERENCES [BOM].[part] ([id])
GO
ALTER TABLE [BOM].[partlinkproduct] CHECK CONSTRAINT [FK_partlinkproduct_part]
GO
/****** Object: ForeignKey [FK_partlinkproduct_product] Script Date: 07/09/2013 23:16:53 ******/
ALTER TABLE [BOM].[partlinkproduct] WITH CHECK ADD CONSTRAINT [FK_partlinkproduct_product] FOREIGN KEY([productid])
REFERENCES [BOM].[product] ([productid])
GO
ALTER TABLE [BOM].[partlinkproduct] CHECK CONSTRAINT [FK_partlinkproduct_product]
GO
/****** Object: ForeignKey [FK_treepart_part] Script Date: 07/09/2013 23:16:53 ******/
ALTER TABLE [BOM].[treepart] WITH CHECK ADD CONSTRAINT [FK_treepart_part] FOREIGN KEY([partid])
REFERENCES [BOM].[part] ([id])
GO
ALTER TABLE [BOM].[treepart] CHECK CONSTRAINT [FK_treepart_part]
GO
/****** Object: ForeignKey [FK_treepart_part1] Script Date: 07/09/2013 23:16:53 ******/
ALTER TABLE [BOM].[treepart] WITH CHECK ADD CONSTRAINT [FK_treepart_part1] FOREIGN KEY([parentid])
REFERENCES [BOM].[part] ([id])
GO
ALTER TABLE [BOM].[treepart] CHECK CONSTRAINT [FK_treepart_part1]
GO
amir3321
جمعه 21 تیر 1392, 05:47 صبح
اساتید محترم کسی نبود نظری بده
Mahmoud.Afrad
جمعه 21 تیر 1392, 18:04 عصر
ای کاش توی اسکریپت یه سری داده آزمایشی هم اضافه میکردی تا بتونیم تست کنیم.
میتونی هر کدوم از کوئری های داخلی رو جدا بنویسی و بعد با هم ترکیب کنی.
کد زیر رو تست کن(من تست نکردم):
int parentId = Convert.ToInt32(textBox1.Text);
int productId = Convert.ToInt32(textBox2.Text);
var q1 = from tpv in db.treepartview
where (tpv.parentid == parentId)
|| (tpv.partid == parentId)
&& (tpv.productid == productId)
&& (tpv.productid2 == productId)
select new
{
PartID = tpv.partid,
ParentID = tpv.parentid,
QTYM = Convert.ToDecimal(tpv.qtym),
TypeID = tpv.typeid
};
var q2 = from tpv in db.treepartview
join p in db.part on tpv.parentid equals p.partid
where (tpv.productid == productId)
&& (tpv.productid2 == productId)
select new
{
PartID = tpv.partid,
ParentID = tpv.parentid,
QTYM = Convert.ToDecimal(tpv.qtym * p.qtym),
TypeID = tpv.typeid
};
var q3 = q1.Union(q2);
var result = from k in q3
group k by k.PartID into g
select new
{
PartID = k.PartID,
SumQTYM = g.Sum(j => j.QTYM)
};
amir3321
شنبه 22 تیر 1392, 13:07 عصر
با سلام خدمت جناب افراد عزیز
مشکل کوئری که شما نوشتید اینه که در q2 در join مورد نظر می بایست همانند کوئری cte که نوشتم با q1 باشه یعنی از نتیجه اولیه استفاده کنه تابتونه یک درخت رو پیمایش کنه و گرنه خروجی میشه تمام select با شرط اولیه
مشکل اون linq که من نوشتم این بود که نمی تونستم این join رو درست کنم و فقط دو سطح اولیه یک درخت رو می آورد وقتی به خروجی sql اون نگاه می کنم میبینم مشکل در همان join می باشد و کلمه parts در cte من alias اون select اول است که با with اون رو ست کردم
با تشکر فراوان منتظر راهنمایی های بعدی شما می باشم
amir3321
چهارشنبه 26 تیر 1392, 12:13 عصر
با سلام خدمت دوستان گرامی
با جستجو های زیاد متوجه شدم هنوز EF از توابع بازگشتی مانند CTE پشتیبانی نمی کند و فعلا به ناچار به صورت STORE PROCEDURE باید استفاده کنم
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.