2012-02-21 14 views
3

[長いったらしい説明のために謝罪]カスタム機能

とDBに対して直接報告する必要があります。わかりませんが、これは私が発見した構造です:

私はグループテーブルとレポートテーブルを持っています。

グループtypeカラム、「R」または「G」、整数numElements及び「R」elements

型と呼ばimage列を持つグループレポートを含むことを意味する、「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は2つのグループIDです。これはアプリケーション自体から確認できます。同じ

は、IDの結果として生じるが、レポート

私はいくつかの賢明なクエリを行うために始めることができるようにEF4 OR T-SQLでこの動作をマップする方法はあり

である「R」タイプに適用されますか?例:

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 

アプリケーション内で、私はそれらを手動でマッピングするために、グループを見ることができるもののので、グループの報告書と何百何千ものがありますが永遠にかかるだろう。ツリービューはありませんので、グループを開いてサブグループ(存在する場合)を開くなどしてください。

私はこれを手動でコーディングして、 split、reverse、convert ...しかし、T-SQLやEFを使って私にこれを行える方法があるのか​​どうか疑問に思っていましたか?


EDIT:多くのグループまたは1:多くの報告(ただし、それらの混合物)

注意してくださいグループが1を含めることができるので、numElementsは、変数です。したがって、16進数の文字列は常に: "0x" + "4 x numElements"の文字長が長い

これは、1つのグループになるように、「16進数int」関数が配列などを返す必要があることを意味します多くのグループ/レポートにリンクされています。

答えて

2

両方を助けてくれるのは、分割、逆変換、変換を行うスカラー関数を作成することだけです。
私は3つの機能を作成します。

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 

残念ながら、あなたは、こののみに基づいて、ナビゲーションプロパティを作成することはできません。しかし、あなたは、ビューを作成することができますLINQ 2 SQLで

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

を私がいる限り、私はモデルでは、ビューのために主キーを定義して、ビューと別のテーブルの間のナビゲーションプロパティを作成することができます。 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 

これが発生しなければなりませんCROSS APPLY演算子を使用したSQL文ですが、今は実行できません(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

が、これはintの配列/リストを返すことができます。このセットは、合理的な方法に限定されている場合、あなたはまだのようなビューを作成することができますか? (SQLエキスパートではありません) – BlueChippy

+0

テーブル関数を作成することはできますが、EFではこれを使用することはできません。 .Net 4.5の出荷時にテーブル機能をサポートします。したがって、そのテーブル関数をビューで使用し、モデル内でマップするようにしてください。 –

+0

http://stackoverflow.com/questions/1545131/entities-adding-a-navigation-property-between-a-view-and-tableここで、テーブルとビューの間にナビゲーションプロパティを追加する方法 –

関連する問題