我正在使用Entity Framework Code-First方法。以下是我的样本模型。
public class LocalizableEntity
{
public int Id{get;set;}
// this property is 'Ignore'd. Need to set this.
public string Name{get;set;}
// this is the collection of 'Name's in all supported cultures.
public virtual ICollection<LocalizationText> LocalNames{get;set;}
}
使用流畅的API,将忽略“名称”属性,例如Ignore(t=>t.Name)
。我的想法是通过查询给定的文化ID来从LocalNames集合中设置Name属性。 LocalizationText类型如下所示。
public class LocalizationText
{
public int Id{get;set;}
public string Text{get;set;}
public string Culture{get;set;}
}
我想实现在我的存储库中选择SINGLE,ALL和BY PREDICATE项目的方法(请考虑LocalizableEntities
和LocalizationText
是DbSets),但是在一个查询中填充Name属性
public LocalizableEntity GetById(int id)
{
var result=LocalizableEntities.Find(id); // selects the item
//the culture will be passed in by other way. Hard-coding here
result.Name=LocalizableEntities.LocalNames.Single(t=>t.Culture=="en-us");
return result;
}
但是上面的实现将需要两次DB调用。我想把它变成一个查询/表达式。我还需要在批量选择时执行此操作,为序列分配Name
的值。
单个查询是否可以实现?如果是的话,有人可以指导我吗? 谢谢:))
答案 0 :(得分:0)
忽略实体模型字段的气味。您的设计似乎非常适合ViewModel。那么假设您有一个名为LocalizationText的实体模型和一个名为LocalizableEntityVM的ViewModel,您可以执行以下操作:
public LocalizableEntityVM GetById(int id, string culture)
{
var result=LocalizationText.Single(le => le.id && le.Culture == culture)
.Select(le => new LocalizableEntityVM
{
Name = le.Text
});
return result;
}