長い話 (詳細については以下を参照) 簡単に言えば、繰り返しデータを既知の xml 形式で返すようにクエリを組み立てることができるので、特定の基準に対して各ノードと子要素が個別に返されることを誰か知っていますか?
編集:私の質問は次のように要約できると思います:重複データが次に発生するまで、繰り返しデータを照会し、エントリのグループを取得するにはどうすればよいですか?
UNB
UNH
MID
DAN
UNS
UNT
UNH
MID
DAN
UNS
UNT
UNH
MID
DAN
UNS
UNT
UNH
MID
DAN
UNS
UNT
UNH
MID
DAN
UNS
UNT
したがって、この場合、いくつかのセグメントが繰り返されることを知っているので、次のグループで UNH - UNT を返すクエリを作成するにはどうすればよいでしょうか:
UNH
MID
DAN
UNS
UNT
完全な詳細
一般的な edi (EDIFACT) を xml マッパーに書き込む必要があります。xml は構造化されており、既知であるため、xml ファイルをインポートするアプリケーションを設計し、エンティティ フレームワークを使用してファイルの構造を抽出して保存します。
Xml 構造は、Translation と呼ばれる自己参照エンティティとして格納されます。翻訳には、xml ノード、マッピング先の Edifact セグメント名、値を抽出するコンポジットと要素の位置が含まれます。翻訳は、(xml 構造を反映するために) 親/子の関連付けとして自身も参照します。UI は、各ノードのコンテンツをセグメント、コンポジット、および要素の位置に自動的に一致させます。私が抱えている問題は、繰り返しデータを適切な繰り返し親ノードに分割する方法です。
親なしで翻訳を抽出し、ツリーを再帰的にたどることでこれを構築しています。
var rootTrans = (from t in Translations
where t.ParentID==null
select t).ToList();
//(msg is the EDI transmission with a collection of segments-each segment contains composites, each composite contains elements with the actual data eg- )
XElement root = new XElement(Tag.Replace(" ", ""));
foreach (var item in rootTrans)
{
item.AddContentRecursive(root, msg);
}
var doc = new XDocument(root);
// AddContentRecursive
public void AddContentRecursive(XElement element, Transmission msg)
{
// Find matching segments for this tag
var segNodes = (from s in msg.Segments
where s.Value == Name
select GetElementValue(s, Positions)).DefaultIfEmpty(null);
// simply add the matching nodes to the parent element
if (Children.Count == 0)
{
var nodes = (from t in segNodes
select new XElement(Tag, t));
element.Add(nodes);
}
else
{
var aNode = new XElement(Tag);
element.Add(aNode);
foreach (var chil in Children.OrderBy(c => c.DocumentOrder))
{
chil.AddContentRecursive(aNode, msg);
}
}
}
EDI ファイルは顧客によって制御され、独自のパターンに従います。以下の例から、UNH セグメントはメッセージ ヘッダーであり、UNT まで繰り返されます。UNH の翻訳エンティティには、タグ (MessageHeader) と呼ばれるプロパティと名前 (UNH) と呼ばれるプロパティがあります。
UNH+ORDERR319952+ORDERR:1::OD'
MID+ORDERR319952+120818'
DAN+:ADVICE NOTE+TGBGU649'
MSD+CR'
SDT+0831824'
BDT+PIPUK+++++RB'
ART++46210JD000:::: :PIPE WORK,RH'
DLV++2160:45'
DTP+120823:1700'
PIN+21'
TCO+:BLB+24+90'
CSG+0831824+F01-XJ10'
UNS+S'
UNT+14+ORDERR319952'
UNH +ORDERR340246+ORDERR:1::OD'
MID+ORDERR340246+120818'
DAN+:ADVICE NOTE+RRHBU636'
MSD+CR'
SDT+0831824'
BDT+PIPUK+++++RB'
ART++46210JD005::::: PIPE WORK,LH'
DLV++2160:45'
DTP+120823:1700'
PIN+21'
TCO+:BLB+24+90'
CSG+0831824+F01-XJ10'
UNS+S'
UNT+14+ORDERR340246'
UNH+ORDERR340247+ORDERR:1::OD'
MID+ORDERR340247+120818'
DAN+:ADVICE NOTE+RRHBU641'
MSD+CR'
SDT+0831824'
BDT+PIPUK+++++ RB'
ART++46210JD600:::::PIPE WORK,RH'
DLV++4200:45'
DTP+120823:1700'
PIN+21'
TCO+:BAC4325+28+150'
CSG+0831824+F01-XJ10'
UNS +S'
UNT+14+ORDERR340247'
クエリ、再帰、ループのさまざまな組み合わせを試しましたが、基本的なものが欠けていることがわかりました。レンガの壁の領域にいます。誰もこの種の問題に遭遇しましたか? クエリを形成するための提案は、高く評価されます。ありがとう