选择数据时排除属性

时间:2012-05-18 13:42:03

标签: entity-framework

我有一个带有虚拟属性(public virtual List<Ingredients>)的类,但在某些情况下我不想获取该数据。我怎样才能做到这一点?我知道.Include.Select,但如果我这样做,我需要在我的存储库中更改大量代码,我也会返回一个Queryable和Service层。

3 个答案:

答案 0 :(得分:5)

间接答案:我不会在服务层中公开IQueryable。至少有三个原因:

  • 访问导航属性时,必须保持上下文的活动状态。
  • 使用服务层的图层可以极大地影响发送到数据库的SQL。您希望控制服务或存储库中的内容。
  • 对服务层进行单元测试非常困难。

因此,如果您在应用程序中公开所需对象的 IEnumerable ,则可以提供具有特定方案中所需的加载导航属性的对象。例如。产品实体(名称等)的维护功能只能获得裸产品(并且没有代码可以访问成分)。从成分中组成产品的功能也会得到其成分。服务/存储库方法应该有参数来指定您需要的内容。

如果您希望100%保证不会访问延迟导航属性,则需要将投影对象(或DTO)公开给您的应用程序。

答案 1 :(得分:0)

默认情况下,不会返回相关属性,您需要使用Include()来指定返回相关属性 这可能并不总是很清楚,如果您使用延迟加载,您不需要显式请求相关属性,EF将确定在请求时是否需要相关属性并将其添加到数据库请求。

要测试此强制LINQ查询在您通过附加.First()声明它时执行,并查看返回的对象,该对象应该没有相关属性。

修改 无法仅从相关属性加载某些属性。如果加载相关属性,将自动加载其所有属性。

答案 2 :(得分:0)

你可以简单地构建一个类SubClass(继承自SomeCompany)并包含你需要的属性,不应该包含在你的代理类中(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,但在代理类中没有。