2010-05-24 45 views
0

我需要做这样的事情,相同的LINQ的两个表

我的两个表具有相同的签名,但不同的类,所以它想工作,但它不工作。

var myTable; 

if (booleanVariable == true) 
{ 
    myTable = table1; 
} 
else 
{ 
    myTable = table2; 
} 


var myLinq1 = from p in myTable 
      join r in myOtherTable 
      select p; 

在这种情况下,我必须初始化为myTable

我也试过,

var myTable= table2; 

if (booleanVariable == true) 
{ 
    myTable = table1; 
} 

var myLinq1 = from p in myTable 
      join r in myOtherTable 
      select p; 

则var为类型表2,那么它不能被更改为table1的类型。

我需要帮助,我不想复制所有代码的粘贴。 linq查询是巨大的,它嵌套5或6个查询。我也必须在12种不同的方法上做到这一点。

非常感谢您的帮助。

+0

现在对不起,我不得不说,但我认为这是一个丑陋,丑陋,丑陋的SQL设计。如果你有两个“相同签名”的表(我认为这意味着相同的列),那么只需要有一个鉴别器列,而不是两个表。 – 2010-05-24 05:39:05

+0

他们来自一个非常不同的来源,所以我最好把它放在另一张桌子上。可能你用这么少的信息就无法理解,但相信我,我只用一张桌子就完成了,而且它没有奏效。我的疑问非常大。所以我改变了设计,并为最终结果工作。但我有麻烦插入数据。数据是完全一样的,但它有一个非常不同的含义。感谢评论,但我已经尝试过 – 2010-05-24 05:52:17

+0

你是完全正确的。我有一个错误,感谢乔恩,我必须改变一点点我的计划,但它是值得的。 – 2010-05-24 06:40:59

回答

0

不知道这是否会工作,从来没有尝试过,但是...

如果这两个类可以实现相同的接口或共享一个基础类,你可以做也许:

var q = (booleanVariable) 
    ? from p in myTable1 select (ISomeInterface)p 
    : from p in myTable2 select (ISomeInterface)p; 

如果你经常使用它,你可以把它放到它自己的方法中 - 我相信它会返回IQueryable <ISomeInterface>。

然后使用LINQ方法而不是LINQ C#语法(即OrderBy()而不是orderby)连接到LINQ查询的其余部分。我只是不知道LINQ-to-SQL是否足够聪明,可以将其转换为正确的SQL查询。

但我同意乔恩的评论 - 这可能是糟糕的设计,应该重新审视。如果你不能自己重组表,那么你只需要读取访问权限,那么如何将这两个表结合在一起,然后将这个视图绑定到LINQ-to-SQL结构中。

+0

这个项目说明日期,并且这些日期改变状态。我必须找到国家改变的最后时刻。这让我的疑问很糟糕,因为最新的变化不一定是某个专栏的最新变化。我将尝试你的方法,并重新考虑设计,当多个人认为我必须检查相同的时候。谢谢你的答案。 – 2010-05-24 06:00:08

+0

它为第一个查询工作,但在第二个嵌套查询出现同样的错误,没有隐式转换类型table1和类型表2 – 2010-05-24 06:12:45

+0

非常感谢乔,我正在改变我的SQL。我有一个错误,但我认为我准时。 – 2010-05-24 06:41:49