有一个非常困难的EntityFramework 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”)。该调用将在person和address表中搜索字符串匹配,并返回填充了Person和Address实体的列表。
不得不说我不完全清楚如何去做但我正在考虑使用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 :(得分:0)
Find方法仅在主键列中搜索。如果我们不使任何列显式主键列,则find方法将抛出错误。通常,EF约定将propertyName + id作为类中的主键。但是如果你想用Name搜索,那么Make添加[Key]到属性。它将成为主键,你将能够找到属性。 dbContext.Addresses.find( “富”);
答案 1 :(得分:0)
创建一个新的对象类型,您将在其上投影两种类型的搜索结果:
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();
...此时您可以根据自己的喜好对列表进行排序。
“结果”和“MainField”相当通用;只是使用它们,因为我并不完全了解您的域模型。