[英]LINQ: Translating a SQL WITH clause to LINQ and Entity Framework
我有一个使用Entity Framework的应用程序。 我想添加一个列出产品的树视图,按类别分组。 我有一个旧的SQL查询,它将获取所有产品和类别,并将它们安排到父节点和子节点中。 我试图将其转换为使用EF的LINQ。 但是SQL有一个我不熟悉的WITH子查询。 我已经尝试使用Linqer和LinqPad对其进行排序,但是他们扼杀了WITH子句,我不知道如何修复它。 在LINQ中这种事情是否可行?
这是查询:
declare @id int
set @id=0
WITH ChildIDs(id,parentid,type,ChildLevel) AS
(
SELECT id,parentid,type,0 AS ChildLevel
FROM dbo.brooks_product
WHERE id = @id
UNION ALL
SELECT e.id,e.parentid,e.type,ChildLevel + 1
FROM dbo.brooks_product AS e
INNER JOIN ChildIDs AS d
ON e.parentid = d.id
WHERE showitem='yes' AND tribflag=1
)
SELECT ID,parentid,type,ChildLevel
FROM ChildIDs
WHERE type in('product','productchild','productgroup','menu')
ORDER BY ChildLevel, type
OPTION (MAXRECURSION 10);
当我运行查询时,我得到的数据看起来像这样(几千行,在这里被截断):
ID.....parentid.....type.....ChildLevel
35429..0............menu.....1
49205..0............menu.....1
49206..49205........menu.....2
169999.49206........product..3
160531.169999.......productchild..4
等等。
您可以使用LINQ to Entities来解决这个问题,但这并非易事,我怀疑它会非常耗时。
在这种情况下,您可能更喜欢构建一个SQL视图或表值函数,它返回您正在查找的结果。 然后将View或Table-Valued Function导入到EF模型中,您可以使用LINQ直接从中提取数据。
在LINQ中查询视图与查询表没什么不同。
要从LINQ中的表值函数获取数据,可以在函数名称后面传递函数的参数,如下所示:
var query = from tvf in _db.MyTableValuedFunction(parameters)
select tvf;
编辑
正如@ thepirat000所建议的那样,在版本5之前的实体框架版本中不提供表值函数支持。为了使用此功能,EF必须在.NET 4.5或更高版本下运行。
在一天结束时,我无法让这个工作。 我最终动态地编写了一个SQL查询并将其直接发送到数据库。 它工作正常,我不依赖任何直接用户输入,因此没有SQL注入的机会。 但它似乎老了! 对于我的其余程序,我使用的是EF和LINQ。
谢谢你的回复!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.