【问题标题】:Linq to SQL - Don't fetch a particular columnLinq to SQL - 不要获取特定列
【发布时间】:2009-05-12 13:07:02
【问题描述】:

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

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

任何想法表示赞赏。

【问题讨论】:

    标签: .net linq linq-to-sql sqlmetal


    【解决方案1】:

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

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

    [Table]
    public class Person
    {
        private Link<string> _name;
    
        [Column(Storage = "_name")]
        public string Name
        {
            get { return _name.Value; }
            set { _name.Value = value; }
        }
    }
    

    另请参阅this post by Scott Guthrie 中的“延迟/延迟加载”部分。


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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        表日志有三列

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

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

        我通过以下声明实现了这一点:


        Dim q = From logItem In dc.Log Select New Log With {.LogID = logItem.LogID, .DateLogged = logItem.DateLogged}


        希望对其他人有所帮助!

        【讨论】:

        • 您是对的,您可以使用“命名”类而不是匿名类,但您仍然“单独指定每个返回的字段”,您在问题中说您不想这样做做:P
        【解决方案4】:

        查看this link,了解如何使用 SQLMetal 启用延迟加载列的示例。

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-23
            • 1970-01-01
            • 1970-01-01
            • 2011-04-23
            • 2010-09-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多