2016-09-27 9 views
0

SQLLINQに変換する方法はありますか。基本的には,PR_TYPおよびPR_GRPの列を持つproject_mstrテーブルがあります。これら3つの列は、のparams_mstrの値です。たとえば、PR_TYPの値がparam_cdにあり、Regularが対応するparam_valの値を持つレコードがあります。LINQと同じテーブルの複数の条件付きで複数の結合を持つSQLを変換する

私はLinquerをインストールしましたが、データベースへの接続をまだ作成しておく必要があるので、私はそれを使用するのが快適ではありません。私はまた、SQLからLINQへのオンラインコンバータを見つけることができません。だから私はここで良質の人にコンバージョンを助けてくれるように頼んでいます。

SELECT 
    c.pr_id, c.pr_class, c.pr_typ, c.pr_grp, cp.pr_price, 
    c.gl_acct_id, c.pr_DESC "Project", 
    pm.param_val "Project Class", pm2.param_val "Project Type", pm3.param_val "Project Group" 
FROM project_mstr c 
JOIN 
    params_mstr pm ON c.pr_class = pm.param_id AND pm.param_cd = 'PR_CLASS' 
JOIN 
    params_mstr pm2 ON c.pr_typ = pm2.param_id AND pm2.param_cd = 'PR_TYP' 
JOIN 
    params_mstr pm3 ON c.pr_grp = pm3.param_id AND pm3.param_cd = 'PR_GRP' 
JOIN 
    pr_price_mstr cp ON c.pr_id = cp.pr_id 
JOIN 
    gl_acct_mstr gl ON c.gl_acct_id = gl.gl_acct_id 
ORDER BY 
    c.crea_dt DESC; 

答えて

3

LINQツーSQLあなたが参加に複数の値を導入する必要がある場合、あなたは上で接合されているすべての値を表すために、匿名クラスを作成できるようにのみ(匿名クラスが必要であることに注意し、等価結合をサポート(1)まったく同じ型のフィールド(2)とまったく同じ名前(3)を正確に同じ順序で持つ必要があることを意味します)。

from c in ProjectMstr 
join pm in ParamsMstr on new { ParamId = c.ChClass, ParamCd = "CH_CLASS" } equals new { pm.ParamId, pm.ParamCd } 
join pm2 in ParamsMstr on new { ParamId = c.ChClass, ParamCd = "CH_TYP" } equals new { pm2.ParamId, pm2.ParamCd } 
join pm3 in ParamsMstr on new { ParamId = c.ChClass, ParamCd = "CH_GRP" } equals new { pm3.ParamId, pm3.ParamCd } 
// … 
orderby c.CreaDt descending 
select new { 
    c.ChId, 
    // … 
    ProjectClass = pm.ParamVal, 
    ProjectType = pm2.ParamVal, 
    ProjectGroup = pm3.ParamVal, 
} 

それは、クエリのロジックを変更しない場合は別の方法として、あなたはwhereへの参加から一定の値を引き出すことができます。

from c in ProjectMstr 
join pm in ParamsMstr on c.ChClass equals pm.ParamId 
join pm2 in ParamsMstr on c.ChClass equals pm2.ParamId 
join pm3 in ParamsMstr on c.ChClass equals pm3.ParamId 
// … 
where pm.ParamCd == "CH_CLASS" 
where pm2.ParamCd == "CH_TYP" 
where pm3.ParamCd == "CH_GRP" 
orderby c.CreaDt descending 
select new { 
    c.ChId, 
    // … 
    ProjectClass = pm.ParamVal, 
    ProjectType = pm2.ParamVal, 
    ProjectGroup = pm3.ParamVal, 
} 
+0

返信いただきありがとうございます!しかし、私はエラーが発生しています: '無効な匿名型メンバー宣言子。 'ParamId = c.ChClass'で始まる最初の結合では、匿名型メンバーはメンバー割り当て、単純名またはメンバーアクセスで宣言する必要があります。以前は匿名の型を扱っていましたが、 'Model'クラスで変数を作成するだけですが、edmxで変数を直接取得しているので、ここでは別のケースです。だから私はここで匿名の型を宣言するのですか?とにかく、私はあなたが提案した2番目のものを使用しようとします。 –

+0

ありがとう、それは働いた!わたしは、あなたを愛しています! Btw、第2の提案でいくつかの変数を変更しました。あなたの質問の変数を編集する前に答えを作成しているからです。 –

関連する問題