有没有办法不使用linqtosql获取特定列而不必使用匿名类型并单独指定每个返回的文件?
我们使用SQLMetal生成dbml文件,该文件包含将查询数据结果放入其中的所有类型。但是,当linq查询中包含select列时,结果将转换为匿名类型,而不是dbml文件中声明的类型。我想从特定表中选择除了一个列之外的所有列,但仍然在相关的dbml类型中返回结果。
任何想法都赞赏。
答案 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语句中执行此操作...示例应该有所帮助!:
表日志有三个列
但我只想要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排除列,因为直接投影将返回所有内容。