我有一个带有虚拟属性(public virtual List<Ingredients>
)的类,但在某些情况下我不想获取该数据。我怎样才能做到这一点?我知道.Include
和.Select
,但如果我这样做,我需要在我的存储库中更改大量代码,我也会返回一个Queryable和Service层。
答案 0 :(得分:5)
间接答案:我不会在服务层中公开IQueryable
。至少有三个原因:
因此,如果您在应用程序中公开所需对象的 IEnumerable
,则可以提供具有特定方案中所需的加载导航属性的对象。例如。产品实体(名称等)的维护功能只能获得裸产品(并且没有代码可以访问成分)。从成分中组成产品的功能也会得到其成分。服务/存储库方法应该有参数来指定您需要的内容。
如果您希望100%保证不会访问延迟导航属性,则需要将投影对象(或DTO)公开给您的应用程序。
答案 1 :(得分:0)
默认情况下,不会返回相关属性,您需要使用Include()来指定返回相关属性 这可能并不总是很清楚,如果您使用延迟加载,您不需要显式请求相关属性,EF将确定在请求时是否需要相关属性并将其添加到数据库请求。
要测试此强制LINQ查询在您通过附加.First()声明它时执行,并查看返回的对象,该对象应该没有相关属性。
修改强> 无法仅从相关属性加载某些属性。如果加载相关属性,将自动加载其所有属性。
答案 2 :(得分:0)
你可以简单地构建一个类SubClass(继承自SomeCompany)并包含你需要的属性,不应该包含在你的代理类中(SomeCompany)。
例如一个类
public class SomeCompany
{
public virtual string SomeProperty { get; set; }
public virtual Company MyCompany { get; set; }
}
public class SomeCompanyEx : SomeCompany
{
public string CompanyName { get; set; }
public override Company MyCompany
{
get
{
return this.myCompany;
}
set
{
this.SetProperty(ref this.myCompany, value);
if (value != null)
{
this.CompanyName = value.Name;
}
else
{
this.CompanyName = null;
}
}
}
}
您可以使用类SomeCompanyEx,例如,在list对象中等等......所以您现在拥有可以在程序中使用的属性CompanyName,但在代理类中没有。