Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对具有不同模式的数据库执行LINQ查询?_C#_.net_Linq To Sql_Entity Framework - Fatal编程技术网

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

C# 如何对具有不同模式的数据库执行LINQ查询?,c#,.net,linq-to-sql,entity-framework,C#,.net,Linq To Sql,Entity Framework,我需要对我无法控制的数据库执行只读查询。我的首选是LINQtoSQL,但是,在我们的开发、QA和生产环境中,列名略有不同 例如,以FolderName列为例。我们可能会: Dev: u34_FolderName QA: u74_FolderName PROD: u56_FolderName 我想进行如下查询: var query = from c in DepartmentReviews where c.FolderName == "Test" 我可以使用实

我需要对我无法控制的数据库执行只读查询。我的首选是LINQtoSQL,但是,在我们的开发、QA和生产环境中,列名略有不同

例如,以
FolderName
列为例。我们可能会:

Dev:  u34_FolderName
QA:   u74_FolderName
PROD: u56_FolderName
我想进行如下查询:

 var query = from c in DepartmentReviews
             where c.FolderName == "Test"
我可以使用实体框架来解决这个问题吗


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

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

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

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

在您的表中,可能会有一列表示唯一标识符,一列表示xml(SQLServer2005/2008自然支持它)。您可以将其序列化为XML(您可能最终会使用一个通用XML序列化程序-
序列化程序
,您可以在运行时使用反射推断其类型)。反序列化它,您就可以得到您的对象。你可以阅读更多关于它的内容

所以你的问题是

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));
var myXML=来自ObjectContext.Table中的c
其中c.FolderName==“Test”选择MyXmlColumn;
var myType=InferTypeFromConfig();
var serializer=新的XmlSerializer();
var object=(myType)序列化程序。反序列化(XMLStreamCreatedFrom(myXml));

我的$0.02

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


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

使用Entity Framework,您可以在构建时操作EDMX文件,以获得每个环境所需的结果,请参阅

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


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

在EF 4中,您可以使用,现在是CTP。

在我看来,你应该找到决定像那样建立DBs的人,彻底击败他。朱哈尔,这是有道理的。很有可能在生产环境中构建234个,qa环境中构建250个,dev环境中构建300个。列名仅仅确保您联系的是正确的表,如果您认为它是在试图阻止@Owen试图做的事情(一刀切的查询)。诚然,his是只读的,但适用于权限的理念也必须适用于本例中的读取。模式由非常复杂的第三方系统管理。我试着让它屈服,但它感觉不到痛苦。这个练习的全部原因是为了解决它公开的API的一些限制。