有没有办法不使用 linqtosql 获取特定列,而不必使用匿名类型并单独指定每个返回的文件?
我们使用 SQLMetal 生成 dbml 文件,该文件包含所有类型的查询数据结果。但是,当在LINQ查询中包含选择列时,结果将变成匿名类型,而不是DBML文件中声明的类型。我想从特定表中选择除一列之外的所有列,但仍然以相关的 dbml 类型返回结果。
任何想法表示赞赏。
有没有办法不使用 linqtosql 获取特定列,而不必使用匿名类型并单独指定每个返回的文件?
我们使用 SQLMetal 生成 dbml 文件,该文件包含所有类型的查询数据结果。但是,当在LINQ查询中包含选择列时,结果将变成匿名类型,而不是DBML文件中声明的类型。我想从特定表中选择除一列之外的所有列,但仍然以相关的 dbml 类型返回结果。
任何想法表示赞赏。
LINQ to SQL 支持延迟加载单个属性。在 DBML 设计器中,您可以Delay Loaded
在true
列的属性中设置。延迟加载的列将不包含在初始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 的这篇文章中的“延迟/延迟加载”部分。
更新:如果您希望该列在需要时仍然可用,则上述答案适用。它不会包含在SELECT
s 中,除非您特别要求(请参阅LoadOptions
)或尝试访问它。
如果您根本不想使用或访问该列,并且不希望它作为类属性使用,那么请使用Serapth从 DBML 文件中删除该列的答案。确保您了解其中的含义,例如丢失对该列的并发检查。
如果您非常懒惰,为什么不通过 DBML 设计器再次添加表,将其重命名为 MyTableWithOutColumnX,然后删除您不希望返回的记录?只需hilite列名并点击删除。
它很草率,但在某种程度上,有一个有时不应该出现记录的表格也是如此。更重要的是,这很容易,它全部在 DBML 中抽象,因此除了切换要访问的表之外,它不应该影响您的代码。名副其实,它甚至可能对在遥远的将来维护您的代码的人有意义。
感谢大家的意见。我决定的最终解决方案是简单地指定我想要带回的列,但是在我想要的类型的新对象中的 Linq 语句中执行此操作......一个示例应该会有所帮助!:
表日志有三列
但我只想要 DateLogged & Serialized 数据。但是,我希望在SQLMetal 生成的数据容器中使用这个
我通过以下语句实现了这一点:
Dim q = 从 dc.Log 中的 logItem 选择具有 {.LogID = logItem.LogID, .DateLogged = logItem.DateLogged} 的新日志
希望可以帮助其他人!
查看此链接以获取有关如何使用 SQLMetal 启用延迟加载列的示例。
它基本上使用 XSLT 对生成的文件进行后处理,以将列类型从转换X
为Link<X>
(两种类型都来自System.Data.Linq
命名空间)
LINQ to SQL 知道要包含哪些列的方式是通过您在查询上投影的匿名类型。我认为没有其他方法可以让 LINQ to SQL 排除列,因为直接投影将返回所有内容。