Linq和重斑点
我有这个文档表,其中包含文档的一些元数据,以及作为blob的文档内容 然后我使用lucene.Net查询我的文档;作为回报,它为我的文档表提供了一个guid列表,还提供了两个字段,其中包含突出显示的文档名的html版本和突出显示搜索关键字的extract 然后我使用linq将这个结果与我的文档表字段连接起来,以获得一个列表作为搜索结果显示。愚蠢的事情是linq试图将blob加载到文档中,尽管它没有在连接中使用 我想有两种选择,我都不喜欢:Linq和重斑点,linq,Linq,我有这个文档表,其中包含文档的一些元数据,以及作为blob的文档内容 然后我使用lucene.Net查询我的文档;作为回报,它为我的文档表提供了一个guid列表,还提供了两个字段,其中包含突出显示的文档名的html版本和突出显示搜索关键字的extract 然后我使用linq将这个结果与我的文档表字段连接起来,以获得一个列表作为搜索结果显示。愚蠢的事情是linq试图将blob加载到文档中,尽管它没有在连接中使用 我想有两种选择,我都不喜欢: 将我的blob移动到新表并将其1-1链接到文档表。我不
- 将我的blob移动到新表并将其1-1链接到文档表。我不喜欢它,因为linq的限制迫使我改变我的db结构
- 添加一个包含“LiteDocument”表的新dbml,并从dbml中的document表中删除blob;我不喜欢它,因为如果文档表发生更改,我有两个地方需要维护
public class LuceneSearchResult
{
public Guid DocumentID { get; set; }
public string FormattedDocumentFileName { get; set; }
public string FormattedDocumentExtract { get; set; }
}
及
在数据库中创建一个排除blob的视图,然后从该视图生成dbml是否有帮助?它与第二个选项没有太大区别,但主要将更改保留在数据库本身,而不需要对现有表结构进行任何更改。您可以指定延迟加载字段。它是DBML设计器中表字段可用的属性之一。延迟加载字段是一种方法。我相信延迟加载字段的实际值只有在调用其属性访问器(例如myDoc.Blob)时才从数据库中获取。因此,只有在真正需要的时候才实际获取blob。
public IList Search(string searchPhrase, Guid? ProductId)
{
searchPhrase = PrepareSearchPhraseWithThesaurus(searchPhrase);
var result = RunLuceneQuery(searchPhrase, ProductId);
var dc = new ChinaHcpDataContext();
var docs =
from r in result
join d in dc.Documents on r.DocumentID equals d.DocumentID
select
new
{
d.DocumentID,
TradeNameEN = d.TradeProduct != null ? d.TradeProduct.TradeNameEN : "",
TradeNameZH = d.TradeProduct != null ? d.TradeProduct.TradeNameZH : "",
d.DocumentFileName,
d.InsertedDateUtc,
d.Size,
DocumentDisplayText = r.FormattedDocumentFileName,
DocumentSelectionReason = r.FormattedDocumentExtract
};
return docs.ToList();
}