Linq:如何返回特定对象的属性

时间:2015-11-24 15:36:26

标签: c# .net entity-framework linq

我有以下型号:

public partial class location
{
   public int Id { get; set; }
   public double Lat { get; set; }
   public double Long { get; set; }

   public virtual ICollection<localserver> localserver { get; set; }
}

在控制器中,当我做的时候:

List<location> l = db.location.ToList();

我也得到了localserver对象。如何在LINQ中只使用位置(Id,Lat和Long)的属性而不使用linq中的Select参数?

2 个答案:

答案 0 :(得分:3)

提取对象的一部分的方法是将其投影到一个新表单,这是.Select()的用途:

var result = db.location
    .Select(x => new
    {
        Id = x.Id,
        Lat = x.Lat,
        Long = x.Long
    })
    .ToList();

现在,您已经明确地询问了如何在不使用.Select()的情况下执行此操作,所以......实际上,答案是&#34;您不会&#34;。您排除了专为您所呈现的方案设计的工具,因此没有有用的答案。

要解决您问题的意图,我会猜测您不想加载localserver个对象的集合,也许是因为它很大并且使用了大量内存。要解决 问题,我建议如下:

  • 如果您正在使用实体框架代码优先,请在创建数据库时检查您的级联选项(如果您正在设置任何数据库)。
  • 检查该集合是否已声明为virtual(您已在此处显示,但请查看实际来源)
  • 通过在某个时间点设置myContext.ContextOptions.LazyLoadingEnabled = true;,检查您是否启用了延迟加载

这应该允许应用程序延迟加载该属性,这意味着该localserver属性的内容将仅从数据库中检索并在实际需要时加载到内存中。如果您无法访问它,它将无法加载并且不会占用任何内存。

答案 1 :(得分:0)

当您获得位置列表实体未提取 Localserver 对象数据时,实体框架具有称为延迟加载的功能。 延迟加载意味着您可以随时获取关联对象,无需再编写一个单独的linq查询。这将仅在您在代码中调用它们时从关联对象中提取数据,然后实体框架将再次调用数据库来加载关联的对象数据。

所以只需使用您的代码,但是如果您想要从位置对象本身中选择一些选定的列而不是您编写的选择并提供列名称。