C# 代码优先实体框架,带有从复杂全文搜索返回结果的存储过程
我正在寻找以下场景的设计建议: 我有一个代码优先的EF5 MVC应用程序。我正在构建一个全文搜索功能,它将包含来自许多表的多个加权列。由于我无法使用这些表中的索引创建视图(其中一些表包含文本/二进制列),因此我创建了一个存储过程,该过程将根据搜索词输出我的对象ID(例如C# 代码优先实体框架,带有从复杂全文搜索返回结果的存储过程,c#,entity-framework,stored-procedures,full-text-search,C#,Entity Framework,Stored Procedures,Full Text Search,我正在寻找以下场景的设计建议: 我有一个代码优先的EF5 MVC应用程序。我正在构建一个全文搜索功能,它将包含来自许多表的多个加权列。由于我无法使用这些表中的索引创建视图(其中一些表包含文本/二进制列),因此我创建了一个存储过程,该过程将根据搜索词输出我的对象ID(例如PersonID)和与该对象关联的排名 我当前的方法是创建一个帮助器类来执行全文搜索,全文搜索调用存储过程,并根据返回的ID从上下文加载所有对象 我的问题是: 我的方法是否合理/遵循合理的最佳实践 还有其他人做过类似的事情吗 是否
PersonID
)和与该对象关联的排名
我当前的方法是创建一个帮助器类来执行全文搜索,全文搜索调用存储过程,并根据返回的ID从上下文加载所有对象
我的问题是:
public List<Person> GetPeople(params string[] p)
{
var people = new List<Person>();
using (var db = new DataContext())
{
var context = ((IObjectContextAdapter)db).ObjectContext;
db.Database.Connection.Open();
var command = db.Database.Connection.CreateCommand();
command.CommandText = "SomeStoredProcedureReturningWeightedResultSetOfPeople";
command.CommandType = System.Data.CommandType.StoredProcedure;
//Add parameters to command object
people = context.Translate<Person>(command.ExecuteReader()).ToList();
}
return people;
}
public List GetPeople(参数字符串[]p)
{
var people=新列表();
使用(var db=new DataContext())
{
var context=((IObjectContextAdapter)db).ObjectContext;
db.Database.Connection.Open();
var command=db.Database.Connection.CreateCommand();
command.CommandText=“SomeStoredProcedureReturningWeightedResultSetOfPeople”;
command.CommandType=System.Data.CommandType.StoredProcess;
//向命令对象添加参数
people=context.Translate(command.ExecuteReader()).ToList();
}
还人,;
}
即使storedprocedure将有一列作为权重值,但在转换它时它也不会被映射。
如果需要,您可以从Person派生一个包含权重值的类。将此作为答案而不是对我的问题进行编辑: 从@Drauka(和谷歌)提供的一些见解来看,这就是我在初始迭代中所做的
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));
最后调用存储过程:
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();
}
公共列表getAdvancedFTSResults(
字符串searchText,int-minRank,
布尔包括迪特尔,
bool包括描述,
国际StartYear,
年底,,
字符串过滤器(标签){
AdvancedFTS sp=新的AdvancedFTS(){
SearchText=SearchText,
MinRank=MinRank,
IncludeTitle=IncludeTitle,
IncludeDescription=IncludeDescription,
StartYear=StartYear,
年终=年终,
过滤器标签=过滤器标签
};
IEnumerable resultSet=_context.Database.ExecuteStoredProcedure(sp,“ResultsAdvancedFTS”);
返回resultSet.ToList();
}
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; }
}
public class ResultsFTSDTO {
public int ID { get; set; }
public decimal weightRank { get; set; }
}
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();
}