如何针对具有不同模式的数据库执行LINQ查询?

时间:2010-06-29 21:07:49

标签: c# .net linq-to-sql entity-framework

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

例如,选择FolderName列。我们可能有:

Dev:  u34_FolderName
QA:   u74_FolderName
PROD: u56_FolderName

我想做这样的查询:

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

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

什么是潜在的解决方案? 3个组件,每个环境都有1个组件?我可以为这些创建公共接口或基类吗?还是针对这些接口或基类?

5 个答案:

答案 0 :(得分:1)

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

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

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

所以你的查询就像

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美元

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您是否考虑过制作自己的数据访问层?如果您的查询仅限于特定的一组案例,那么它将不是一个完全成熟的框架。您将在三个数据库模式的顶部有一个共同的词汇表,并且您将在运行时选择正确的原始列名称。你只是用老式的方式缝合你的问题。

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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