Delegowanie to jako odpowiedź, a nie edytuje moje pytanie:
Biorąc niektóre wglądu dostarczonych przez @ Drauka (oraz Google) tutaj jest to, co zrobił dla mojej pierwszej iteracji.
- Utworzono procedurę składowaną, aby wykonać wyszukiwanie pełnotekstowe.To było naprawdę zbyt skomplikowane, aby je wykonać w EF, nawet jeśli jest obsługiwane (jako przykład niektóre z moich jednostek są powiązane za pomocą logiki biznesowej i chciałem je zgrupować wracając jako pojedynczy wynik). Procedura składowana mapuje do DTO z identyfikatorem podmiotu i Rangą.
- I zmodyfikowane tego blogera urywek/kod, aby wykonać połączenie do procedury przechowywanej i wypełnić moje dto: http://www.lucbos.net/2012/03/calling-stored-procedure-with-entity.html
I wypełnić moje wyniki obiekt z sumy oraz informacji stronicowania z wyników procedury przechowywanej, a potem po prostu załadować podmioty na bieżącej stronie wyników:
int[] projectIDs = new int[Settings.Default.ResultsPerPage];
foreach (ProjectFTS_DTO dto in
RankedSearchResults
.Skip(Settings.Default.ResultsPerPage * (pageNum - 1))
.Take(Settings.Default.ResultsPerPage)) {
projectIDs[index] = dto.ProjectID;
index++;
}
IEnumerable<Project> projects = _repository.Projects
.Where(o=>projectIDs.Contains(o.ProjectID));
Pełna Realizacji:
Ponieważ to pytanie otrzymuje wiele wyświetleń, pomyślałem, że warto byłoby opublikować więcej szczegółów na temat mojego ostatecznego rozwiązania, aby inni mogli pomóc lub poprawić sytuację.
Kompletne rozwiązanie wygląda następująco:
DatabaseExtensions klasa:
public static class DatabaseExtensions {
public static IEnumerable<TResult> ExecuteStoredProcedure<TResult>(
this Database database,
IStoredProcedure<TResult> procedure,
string spName) {
var parameters = CreateSqlParametersFromProperties(procedure);
var format = CreateSPCommand<TResult>(parameters, spName);
return database.SqlQuery<TResult>(format, parameters.Cast<object>().ToArray());
}
private static List<SqlParameter> CreateSqlParametersFromProperties<TResult>
(IStoredProcedure<TResult> procedure) {
var procedureType = procedure.GetType();
var propertiesOfProcedure = procedureType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
var parameters =
propertiesOfProcedure.Select(propertyInfo => new SqlParameter(
string.Format("@{0}",
(object) propertyInfo.Name),
propertyInfo.GetValue(procedure, new object[] {})))
.ToList();
return parameters;
}
private static string CreateSPCommand<TResult>(List<SqlParameter> parameters, string spName)
{
var name = typeof(TResult).Name;
string queryString = string.Format("{0}", spName);
parameters.ForEach(x => queryString = string.Format("{0} {1},", queryString, x.ParameterName));
return queryString.TrimEnd(',');
}
public interface IStoredProcedure<TResult> {
}
}
Klasa trzymać przechowywanych proc wejść:
class AdvancedFTS :
DatabaseExtensions.IStoredProcedure<AdvancedFTSDTO> {
public string SearchText { get; set; }
public int MinRank { get; set; }
public bool IncludeTitle { get; set; }
public bool IncludeDescription { get; set; }
public int StartYear { get; set; }
public int EndYear { get; set; }
public string FilterTags { get; set; }
}
Wyniki obiektu:
public class ResultsFTSDTO {
public int ID { get; set; }
public decimal weightRank { get; set; }
}
Na koniec wywołanie procedury przechowywanej:
public List<ResultsFTSDTO> getAdvancedFTSResults(
string searchText, int minRank,
bool IncludeTitle,
bool IncludeDescription,
int StartYear,
int EndYear,
string FilterTags) {
AdvancedFTS sp = new AdvancedFTS() {
SearchText = searchText,
MinRank = minRank,
IncludeTitle=IncludeTitle,
IncludeDescription=IncludeDescription,
StartYear=StartYear,
EndYear = EndYear,
FilterTags=FilterTags
};
IEnumerable<ResultsFTSDTO> resultSet = _context.Database.ExecuteStoredProcedure(sp, "ResultsAdvancedFTS");
return resultSet.ToList();
}