Регистрация этого как ответ, а не редактировать к моему вопросу:
Беря часть понимания, обеспеченного @Drauka (и Google), вот то, что я сделал для своего начального повторения.
- Created the stored procedure to do the full text searching. It was really too complex to be done in EF even if supported (as one example some of my entities are related via business logic and I wanted to group them returning as a single result). The stored procedure maps to a DTO with the entity id's and a Rank.
- I modified this blogger's snippet/code to make the call to the stored procedure, and populate my DTO: http://www.lucbos.net/2012/03/calling-stored-procedure-with-entity.html
I populate my results object with totals and paging information from the results of the stored procedure and then just load the entities for the current page of results:
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 projects = _repository.Projects
.Where(o=>projectIDs.Contains(o.ProjectID));
Full Implementation:
Поскольку этот вопрос получает много взглядов, я думал, что может иметь смысл отправлять больше деталей моего конечного решения для помощи других или возможного улучшения.
Полное решение похоже:
Класс DatabaseExtensions:
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
Класс, чтобы держать сохраненные исходные данные proc:
class AdvancedFTS :
DatabaseExtensions.IStoredProcedure {
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; }
}
Объект результатов:
public class ResultsFTSDTO {
public int ID { get; set; }
public decimal weightRank { get; set; }
}
Наконец запрос хранимой процедуры:
public List 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 resultSet = _context.Database.ExecuteStoredProcedure(sp, "ResultsAdvancedFTS");
return resultSet.ToList();
}