1

有一个非常困难的EntityFramework Code First问题。我会尽可能保持简单。使用Code First搜索实体框架域模型

假设我们拥有类n个,让我们用2开始,现在

public class Person 
{ 
    public string Name { get; set; } 
} 



public class Address 
{ 
    public string AddressLine1 { get; set; } 
    public string AddressLine2 { get; set; } 
} 

那么现在,我想要做的是能有一个字符串,即类似的DbContext搜索域模型.Search(“Foo”)。该调用将搜索人员和地址表以进行字符串匹配,并返回一个填充了人员和地址实体的列表。

不得不说,我并不完全清楚如何去了解它,但我使用DataAnnotations做这样的事情

public class Person 
{ 
    **[Searchable]** 
    public string Name { get; set; } 
} 



public class Address 
{ 
    **[Searchable]** 
    public string AddressLine1 { get; set; } 
    **[Searchable]** 
    public string AddressLine2 { get; set; } 
} 

我在正确的轨道上考虑? 我应该使用Fluent API吗? 反思?

任何和所有的想法大量赞赏。

+0

你是什么意思的“搜索域模型”?您是否期望搜索已加载的实体或在数据库中进行搜索? – 2012-08-07 11:10:29

+0

好吧,想象一下,我有以下类,所有书面和所有存在数据库,用户,地址,人员,配置文件等。我想要能够做的是跨所有搜索字段(由我标记)包含可搜索字段的类,并返回包含搜索词的所有实体的联合(在本例中为简单字符串,如'John Smith')。 – 2012-08-07 13:47:33

回答

0

Find方法仅在主键列中搜索。如果我们没有明确列出主键列,那么find方法会抛出错误。通常,EF约定将propertyName + id作为该类中的主键。但是如果你想使用Name进行搜索,那么Make将[Key]添加到属性中。它将成为主键,你将能够找到属性。 dbContext.Addresses.find(“Foo”);

0

创建了一个可将项目2种类型的搜索结果的新的对象类型:

public class Result 
{ 
    public string MainField { get; set; } 
    // you may have other properties in here. 
} 

然后找到符合条件的每一种类型的实体,它们投射到该类型:

var personResults = DbContext.Persons 
     .Where(p => p.Name == "Foo") 
     .Select(p => new Result{MainField = p.Name}); 
     // don't forget to map to any other properties you have in Result as well 


var addressResults = DbContext.Adresses 
    .Where(a => 
     a.AddressLine1 == "Foo" || 
     a.AddressLine2 == "Foo" 
    ). 
    .Select(a => new Result{MainField = a.AddressLine1 + ", " + a.AddressLine2 }); 
    // again, don't forget to map to any other properties in Result 

然后合并列表:

var allResults = personResults.Union(addressResults).ToList(); 

......此时,你可以howev排序列表呃你喜欢。

“Result”和“MainField”是相当通用的;只是使用它们,因为我没有完全意识到你的域模型。

+0

这是正确的方向,但它需要被运行时发现,即如果我有27个表我不能写var table1 =,var table2 =等我需要能够扫描域模型,发现哪些表可搜索和然后运行时创建查询。那有意义吗? – 2012-08-07 11:52:26

+0

@Alan:听起来你正在寻找全文搜索。这不适用于EF。这个解决方案的性能会很糟糕。 – 2012-08-07 11:54:20

+0

因此,您没有提前了解数据库架构方面的知识吗?我无法想象如何使用实体框架来做到这一点。 – Faust 2012-08-07 11:56:06

相关问题