У меня есть запрос, который, кажется, работает, но это занимает вечность.Я думаю, что если я разобью запрос на две части и передам результат первого запроса во второй, это может быть более эффективным.
Идея состоит в том, что таблица содержит данные для многих символов.Есть ли способ запросить в таблице только эти символы, например, 'AAPL', а затем передать этот результирующий набор в следующий запрос?
Это на SQL Server 2008 R2.
SELECT
T1.CompSymbol,
T1.TradeDate,
T1.Expiry,
MIN(T2.Expiry) AS 'FrontMonthContract' ,
MIN(T1.CompATMSynthStrike) AS 'CompATMSynthStrike',
MIN(T1.CompATMSynthIV) AS 'CompATMSynthIV'
FROM
BandHistory1M T1, BandHistory1M T2
WHERE T1.TradeDate <= T2.Expiry AND T1.CompSymbol = 'AAPL'
GROUP BY T1.CompSymbol , T1.TradeDate, T1.Expiry
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Data.Linq.Mapping;
namespace ConsoleGetFrontMonth
{
class Program
{
static void Main(string[] args)
{
Dictionary<int, int> frontMonthContract = new Dictionary<int, int>();
frontMonthContract.Add(4, 17);
frontMonthContract.Add(5, 16);
frontMonthContract.Add(6, 20);
frontMonthContract.Add(7, 18);
frontMonthContract.Add(8, 22);
frontMonthContract.Add(9, 19);
frontMonthContract.Add(10, 17);
frontMonthContract.Add(11, 21);
//frontMonthContract.Add(5, 16);
//frontMonthContract.Add(5, 16);
BandsEntities bandsContext = new BandsEntities();
IQueryable<BandHistory1M> symbolQuery =
from source in bandsContext.BandHistory1M
where source.CompSymbol == "AAPL"
select source;
foreach (var Symbol in symbolQuery)
{
int dayExpires;
if(false == frontMonthContract.TryGetValue(Symbol.TradeDate.Month, out dayExpires))
continue;
if (Symbol.TradeDate.Month == Symbol.Expiry.Month)
{
if (Symbol.TradeDate.Day < dayExpires)
{
Console.WriteLine("{0} {1} {2}", Symbol.CompSymbol, Symbol.TradeDate, Symbol.Expiry);
}
}
else if(1 == (Symbol.Expiry.Month - Symbol.TradeDate.Month))
{
if(Symbol.TradeDate.Day > dayExpires)
Console.WriteLine("{0} {1} {2}", Symbol.CompSymbol, Symbol.TradeDate, Symbol.Expiry);
}
}
Console.ReadLine();
}
}
}