繁体   English   中英

如何对具有不同架构的数据库执行 LINQ 查询?

[英]How do I execute LINQ queries against a database with varying schema?

我需要对我无法控制的数据库执行只读查询。 我的首选是 Linq to SQL,但是,列名在我们的 Dev、QA 和生产环境之间略有不同。

例如,采用FolderName列。 我们可能有:

Dev:  u34_FolderName
QA:   u74_FolderName
PROD: u56_FolderName

我想做这样的查询:

 var query = from c in DepartmentReviews
             where c.FolderName == "Test"

我可以使用实体框架来解决这个问题吗?

潜在的解决方案是什么样的? 3 个程序集,每个环境 1 个? 我可以为其中的每一个创建通用接口或基类并针对它们编写代码吗?

更改模式始终是一个问题。 虽然我不是在数据库中存储 XML 的大力倡导者,但您的问题听起来可以利用这种方法。

此解决方案要求您进行一次(并且仅进行一次架构更改)。它在您的应用程序中可能/可能不可行。

在您的表中,您可能会有一个用于唯一标识符的列和一个用于 xml 的列(SQL Server 2005/2008 自然支持它)。 您可以将其序列化为 XML(您可能最终会使用通用的 XML Serializer- Serializer<T> ,您将在运行时使用反射推断其类型)。 反序列化它,你就可以得到你的对象。 您可以在此处阅读更多相关信息。

所以你的查询会像

var myXML = from c in ObjectContext.Table
             where c.FolderName == "Test" select MyXmlColumn;

var myType = InferTypeFromConfig();
var serializer = new XmlSerializer<myType>();
var object = (myType )serializer.Deserialize(TheXMLStreamCreatedFrom(myXml));

我的 0.02 美元

您可能需要使用 XmlMappingSource 而不是默认的 AttributeMappingSource。 使用 XmlMappingSource,您可以自定义 xml 文件中的列映射,独立于主应用程序。 这应该允许您从 dev、qa 和 production 拥有不同的映射。

您是否考虑过制作自己的数据访问层? 如果您的查询仅限于一组特定的案例,那么它就不是一个成熟的框架。 您将有一个位于三个数据库模式之上的通用词汇表,并且您将在运行时选择正确的原始列名称。 你只需用老式的方式来整理你的查询。

尽管您必须手动编写查询,但如果您的本机数据结构是 IEnumerable,您仍然保留了 LINQ 的许多客户端功能。

使用实体框架,您可以在构建时操作 EDMX 文件以获得每个环境所需的结果,请参阅http://msdn.microsoft.com/en-us/library/cc982042.aspx

例如,您可以创建一个项目,在构建时为适当的环境进行预处理,并将此项目文件作为第一个构建的项目包含在 MSBUILD 中。

或者,您可以生成多个 CSDL、MSL、SSDL 文件并在运行时在它们之间切换,而不是使用默认行为,即从构建过程中嵌入的资源加载它们。

在 EF 4 中,您可以使用目前在 CTP 中的Code First轻松完成此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM