17

有没有办法使用 linqtosql 获取特定列,而不必使用匿名类型并单独指定每个返回的文件?

我们使用 SQLMetal 生成 dbml 文件,该文件包含所有类型的查询数据结果。但是,当在LINQ查询中包含选择列时,结果将变成匿名类型,而不是DBML文件中声明的类型。我想从特定表中选择除一列之外的所有列,但仍然以相关的 dbml 类型返回结果。

任何想法表示赞赏。

4

5 回答 5

18

LINQ to SQL 支持延迟加载单个属性。在 DBML 设计器中,您可以Delay Loadedtrue列的属性中设置。延迟加载的列将不包含在初始SELECT. 如果您尝试访问对象的属性但尚未加载,则将SELECT执行另一条语句以从数据库中获取该值。

如果您手动编辑 DBML 文件,请将<Column IsDelayLoaded="true">. 如果您要手动编写 LINQ to SQL 类,则只需将属性的支持字段声明为 aLink<T>而不是T. 例如:

[Table]
public class Person
{
    private Link<string> _name;

    [Column(Storage = "_name")]
    public string Name
    {
        get { return _name.Value; }
        set { _name.Value = value; }
    }
}

另请参阅Scott Guthrie 的这篇文章中的“延迟/延迟加载”部分。


更新:如果您希望该列在需要时仍然可用,则上述答案适用。它不会包含在SELECTs 中,除非您特别要求(请参阅LoadOptions)或尝试访问它。

如果您根本不想使用或访问该列,并且不希望它作为类属性使用,那么请使用Serapth从 DBML 文件中删除该列的答案。确保您了解其中的含义,例如丢失对该列的并发检查。

于 2009-05-12T13:44:38.063 回答
4

如果您非常懒惰,为什么不通过 DBML 设计器再次添加表,将其重命名为 MyTableWithOutColumnX,然后删除您不希望返回的记录?只需hilite列名并点击删除。

它很草率,但在某种程度上,有一个有时不应该出现记录的表格也是如此。更重要的是,这很容易,它全部在 DBML 中抽象,因此除了切换要访问的表之外,它不应该影响您的代码。名副其实,它甚至可能对在遥远的将来维护您的代码的人有意义。

于 2009-05-12T14:00:56.970 回答
1

感谢大家的意见。我决定的最终解决方案是简单地指定我想要带回的列,但是在我想要的类型的新对象中的 Linq 语句中执行此操作......一个示例应该会有所帮助!:

表日志有三列

  • 日志ID
  • 日期记录
  • 序列化数据

但我只想要 DateLogged & Serialized 数据。但是,我希望SQLMetal 生成的数据容器中使用这个

我通过以下语句实现了这一点:


Dim q = 从 dc.Log 中的 logItem 选择具有 {.LogID = logItem.LogID, .DateLogged = logItem.DateLogged} 的新日志


希望可以帮助其他人!

于 2009-05-12T14:54:05.007 回答
1

查看此链接以获取有关如何使用 SQLMetal 启用延迟加载列的示例。

它基本上使用 XSLT 对生成的文件进行后处理,以将列类型从转换XLink<X>(两种类型都来自System.Data.Linq命名空间)

于 2011-05-06T09:25:38.013 回答
0

LINQ to SQL 知道要包含哪些列的方式是通过您在查询上投影的匿名类型。我认为没有其他方法可以让 LINQ to SQL 排除列,因为直接投影将返回所有内容。

于 2009-05-12T13:12:08.397 回答