2016-09-08 3 views
1

Entity Framework 6.1を使用してデータベースのスカラー関数の結果を列として選択する方法これは純粋なSQLクエリです:他のテーブルから情報を収集し、VARCHAR結果を返しますdbo.GetAdditionalInfo(INT Id)EF 6.1スカラー関数の結果を選択

SELECT 
Id AS Id 
, Name AS Name 
, dbo.GetAdditionalInfo(Id) AS AdditionalInfo 
FROM Users 
WHERE Status = 1 

データベース機能。どのようにEF 6.1を使用してそれを行うには?もちろん

var usersList = ctx.Users 
.Where(n=>n.Status == 1) 
.Select(n=>new{ 
    Id = n.Id 
    , Name = n.Name 
    , AdditionalInfo = ctx.DataBase.GetScalarFunctionResult<string>("dbo.GetAdditionalInfo (@)", n.Id) 
}).ToList(); 

ctx.DataBase.GetScalarFunctionResult<T>(string ScalarFunctionName, params object args) 

が存在せず、それが働いていない:私はこのようなものが必要。しかし、実装されていれば、非常に便利で簡単に使用できます。

+0

?私はそれを見つけることができません。あなたが作ったものなの? 'Database'プロパティの拡張メソッドですか? –

+0

私が言及したように、関数 'GetScalarFunctionResult'は存在しません。私は何をしたいのかを説明するために例として使用しました。 @kiziuは外部ライブラリを使って(おそらくそれはうまくいくでしょう)提案しましたが、私はそのような方法が嫌いです。私は元のSQLクエリを使用して、それは正常に動作します。将来のバージョンのEFがSQL関数の呼び出しをサポートすることを望みます。 – Spark13

答えて

1

次のように試すことができます。

名前空間:using System.Data.Entity.SqlServer

var usersList = ctx.Users 
    .Where(n=>n.Status == 1) 
    .Select(n=>new{ 
     Id = n.Id, Name = n.Name, 
     AdditionalInfo = ctx.Database.SqlQuery<string>(yourQuery, parameters).FirstOrDefault() 
     }).ToList(); 

参考:Execute Native SQL Query

+0

あなたの例はどのように動作しますか?リスト内の各オブジェクトに同じAdditionalInfoがあります。私は、Listの各要素を繰り返し処理し、ネイティブSQLを実行してAdditionalInfoを満たすことができますが、パフォーマンスに問題があります。実際のケースは、私が例で説明したより複雑です。 – Spark13

+0

私はpost.pleaseを更新しました。 – Sampath

+0

"LINQ to Entitiesは、 'System.Data.Entity.Infrastructure.DbRawSqlQuery'1 [System.String] SqlQuery [String](System.String、System.Object [])メソッドのメソッドを認識しません。このメソッドをストア式に変換することはできません。シンプルな "SELECT '1"に関数を呼び出す代わりにしようとした - も動作しません。 – Spark13

0

あなたは、この(と仮定するとクラスがDBContextから継承)試すことができます。

この関数 `GetScalarFunctionResult`ある
String decryptedValue = String.Empty; 
try { 
    List<SqlParameter> parametros = new List<SqlParameter>(); 
    parametros.Add((new SqlParameter("@Data", value) { 
     SqlDbType = System.Data.SqlDbType.VarBinary })); 
    parametros.Add((new SqlParameter("@KeyValue", key) { 
     SqlDbType = System.Data.SqlDbType.VarChar })); 

    String v = null; 
    v = this.Database.SqlQuery<String>(
     "SELECT SEGURIDAD.FN_Get_DecryptionData(@Data,@KeyValue)", parametros.ToArray()).FirstOrDefault(); 
    decryptedValue = v; 
} catch(Exception ex) { 

} 
+0

返信ありがとうございましたが、質問は複雑なLINQクエリでSQL関数の結果を列(返されたオブジェクトのプロパティ)として使用する方法でした。あなたの例では、純粋なSQLを呼び出し、単純な文字列の結果を取得しています。私は純粋なSQLと同様のメソッドを使用しますが、エンティティフレームワークのメリットはありません。例えば。関数名や関数のパラメータを変更したり、別のDB型に切り替えると、私の解決策はエラーなく正常にコンパイルされます。私はテキストで検索し、SQLクエリのテキストを編集する必要があります。それは容認できますが、良くありません。 – Spark13

関連する問題