私は、Web API、Entity FrameworkのとのODataに新しいです。私は別のフォーラムで同様の質問をしましたが、関連する回答は得られていません。のWeb APIのODataカスタムクエリ問題
我々は、Salesforceで使用するためのOData準拠のWeb APIサービスを持っています。オラクルには、複雑なクエリを公開して公開する必要があります。
私たちはODATAパラメータフィルタリングが発生するためにも許可するようにカスタムクエリを使用する方法がわからないのですか? ($ filter、$ top、$ skipなど)たとえば、$フィルタを使用すると、そのフィルタをカスタムクエリに適用し、それをデータベースに戻して結果セットを返すようにしたいとします。これどうやってするの?
私が持っているように見える問題は、彼らが来るが、彼らは、Oracleに渡されるクエリに翻訳されていないとして、私はパラメータを見ることができるということです。それは、完全な結果セットを返すクエリを起動し、次にパラメータを適用するようです。結果セットが非常に大きいため、これは非常に遅いです。
私は2つのものを見つけようとしています 1.カスタムSQLを使用して、元のクエリにodataパラメータを適用するにはどうすればよいですか? 2. EFまたはカスタムクエリを使用する場合、どのようにクエリにodataパラメータを適用して、クエリがデータベースに送信されたときに$ filterパラメータがクエリに含まれるようにすることができますか?私は完全な結果が返され、フィルタを適用したくない。
誰でも私にこれを実現させる方法についてのいくつかの指針を与えることができますか?
private static ODataValidationSettings _validationSettings = new ODataValidationSettings();
//public IHttpActionResult GetName()
//{ }
// GET: odata/ShareData
[ODataRoute("Orders")]
[EnableQuery(PageSize = 50)]
public IHttpActionResult GetOrders(ODataQueryOptions<Orders> queryOptions)
{
// validate the query.
try
{
queryOptions.Validate(_validationSettings);
}
catch (ODataException ex)
{
return BadRequest(ex.Message);
}
try
{
string connectionString = ConfigurationManager.ConnectionStrings["DNATestConnectionString"].ConnectionString;
var items = GetDataItems(connectionString);
return Ok<IEnumerable<Orders>>(items);
}
catch (Exception ex)
{
return StatusCode(HttpStatusCode.InternalServerError);
}
}
#region Load Data Methods
private static List<Orders> GetDataItems(string connectionString)
{
List<Orders> items = new List<Orders>();
using (OracleConnection con = new OracleConnection(connectionString))
{
con.Open();
using (OracleCommand cmd = con.CreateCommand())
{
cmd.CommandText = "select po_header_id, segment1, vendor_id, vendor_site_id from po_headers_all where vendor_id=4993";
using (OracleDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
items.Add(ToOrders(rdr));
}
}
}
return items;
}
private static Orders ToOrders(OracleDataReader rdr)
{
Orders data = new Orders();
data.VENDOR_ID = ToInt32(rdr, "VENDOR_ID");
data.VENDOR_SITE_ID = ToInt32(rdr, "VENDOR_SITE_ID");
data.PO_HEADER_ID = ToInt32(rdr, "PO_HEADER_ID");
data.SEGMENT1 = Convert.ToString(rdr["SEGMENT1"]);
return data;
}
private static int ToInt32(OracleDataReader rdr, string name)
{
int index = rdr.GetOrdinal(name);
return rdr.IsDBNull(index) ? 0 : Convert.ToInt32(rdr[index]);
}
#endregion