[英]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.