Linq to SQL - 不要获取特定列

时间:2009-05-12 13:07:02

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

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

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

任何想法都赞赏。

5 个答案:

答案 0 :(得分:18)

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中的“延迟/延迟加载”部分。


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

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

答案 1 :(得分:4)

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

它草率,但在某种程度上,所以有一张桌子,有时候不应该出现记录。更重要的是,它很容易,它在DBML中被抽象出来,因此它不会影响你的代码,除了切换要访问的表。名字很好,甚至可能对在遥远的未来维护代码的人有意义。

答案 2 :(得分:1)

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

表日志有三个列

  • LOGID
  • DateLogged
  • SerializedData

但我只想要DateLogged&amp;序列化数据。但是,我希望中由SQLMetal生成的datacontainer

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


Dim q = from logItem in dc.Log选择New Log With {。LogID = logItem.LogID,.DateLogged = logItem.DateLogged}


希望能帮助其他人!

答案 3 :(得分:1)

查看this link以获取如何使用SQLMetal启用延迟加载列的示例。

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

答案 4 :(得分:0)

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