2012-02-21 67 views
3

[道歉了长篇大论的解释]自定义函数来确定

我已经从一个(非常!)老产品继承了AOLD应用程序与SQL数据库在任一EF4或直T-SQL的“导航”属性和我需要直接对数据库进行一些报告。不完全确定为什么但这是我发现的结构:

我有一个组表和一个报表。

组具有type柱,“R”或“G”,的整数numElementsimage柱称为elements

类型“R”是指基团中含有的报告,“G”是指它包含更多的组。

type = 'G' 
elements = 0x2C002600 
numelements = 2 
result = take chunks of 4 characters, 
     reverse the last and first two character pairs to get 002C and 0026 
convert hex to int to get 44 and 38 

44和38是两个组ID - 我可以在应用程序本身内进行验证。

这同样适用于式“R”,其中ID的所得报道

有没有什么方法来映射在EF4 OR T-SQL这种行为,这样我就可以开始做一些合理的疑问? 例如

If type = G and numElements = 3 
    split the hex string into 3 chunks of 4 characters, 
    reverse character pairs, 
    convert to int, 
    map to Groups 

If type = R and numElements = 11 
    split the hex string into 11 chunks of 4 characters, 
    reverse character pairs, 
    convert to int, 
    map to Reports 

有成千上万的报告和数百个团体,所以虽然在应用程序中,我可以看到的分组,手动映射他们将永远需要。没有树形视图,所以我必须打开一个组来看看它包含了什么,然后打开子组(如果存在)等等。

我知道我可以手动编码,并通过逐行扫描,行abnd提取,分割,反向,转换...但想知道是否有一种方法我可以得到T-SQL或EF来为我做这个?


编辑:

请注意,是包含numElements变量,因为一个组可以包含1:许多团体或1:很多报道(但其中没有一个混合物)。因此十六进制字符串总是: “0x”+“4 x numElements”字符长

这意味着“十六进制到int”函数需要能够返回一个数组或类似的,以便1组可以是链接到许多组/报告。

回答

2

唯一能帮助你的是创建一个标量函数,它可以进行分割,反转和转换。
我将创建三个功能:

dbo.fnSplitHex(varchar hex, int chunks) -- the actual split etc 

dbo.fnSplitGHex(varchar hex) return dbo.fnSplitHex(hex, 3) -- pass 3 for chunks 
dbo.fnSplitRHex(varchar hex) return dbo.fnSplitHex(hex, 11) -- pass 11 for chunks 

不幸的是在此基础上只有你创建一个导航属性。然而,你可以创建一个视图:

select *, dbo.fnSplitHex(..) from table1 

使用LINQ 2 SQL我可以创建视图和另一个表之间的导航属性,只要我定义的PrimaryKey的观点,在模型中。 EF不确定...EF also

响应论问题编辑

由于转换函数取决于包含numElements,外部输入和不喜欢六角 PARAM这是在主表中的列,并且可以是从那里读取,您无法在主表和“组”或“报告”之间创建NavigationProperty。


不幸的是,您的问题并不止于此。这是一个表函数(返回一个表与int类型的单柱),EF不能在下面的示例中使用它作为“组合的”功能,如:

from c in Groups 
    from sg in fnGetIntsFromHex('G', 3, c.hex) into groups from sg in groups.DefaultIfEmpty() 
    join g in Groups on sg.GroupId equals g.GroupId 
    select g 

这将具有以产生SQL语句与一个CROSS APPLY运算符,但现在它不能这样做(EF 2011年6月CTE可以,但是CTE)。


还剩下什么?我认为回到存储过程并不是一件坏事。其他选项取决于您设置的numElements。如果这个集合被限制在合理的范围内,你仍然可以创建如下所示的视图:

create view dbo.vwSubgropus3 
as 
begin 

select f.GroupId, f.Value = SubGroupId 
from group g 
where g.Type = 'G' 
cross apply fnGetIntsFromHex(g.Hex, 3) f 


create view dbo.vwSubgropus11 
as 
begin 

select f.GroupId, f.Value as SubGroupId 
from group g 
where g.Type = 'G' 
cross apply fnGetIntsFromHex(g.Hex, 11) f 


create view dbo.vwReports3 
as 
begin 

select f.GroupId, f.Value as ReportId 
from group g 
where g.Type = 'R' 
cross apply fnGetIntsFromHex(g.Hex, 3) f 
+0

这可以返回一个数组/列表的整数吗? (不是SQL专家!) – BlueChippy 2012-02-21 08:49:40

+0

您可以创建表函数,但现在不能将它用于EF。当.Net 4.5发货时,他们将支持表格功能。因此,在视图中使用该表函数并尝试将其映射到模型中。 – 2012-02-21 08:54:41

+0

http://stackoverflow.com/questions/1545131/entities-adding-a-navigation-property-between-a-view-and-table在这里如何添加一个表和视图之间的导航属性 – 2012-02-21 08:55:49