Linq-To-Sql可以了解两个表的相似之处吗?

时间:2009-10-07 17:32:48

标签: .net sql linq linq-to-sql

想象一下,我的数据库中有2个表,具有相同的模式(列,类型等)。 Linq-To-Sql可以使用相同的类将它们视为Table<AClass>吗?怎么做?

5 个答案:

答案 0 :(得分:2)

UNION和CONCAT运算符可以在不同的表中使用,就像多个表一样容易使用。指向UNION和CONCAT运算符的链接:http://blog.benhall.me.uk/2007/08/linq-to-sql-difference-between-concat.html

如果您有轻微的差异,可以通过创建一个仅暴露相同字段(并重命名任何不匹配)的包装器对象来隐藏它们。

这是一个LINQPAD示例,我使用了两个不匹配的表。它运行正常(合并我按预期添加到第二行的假行):

var set1 = from  t in TestTriggers
select new {t.TestTriggerID} ;

var set2 = from t in TestTrigger2s
select new {t.TestTriggerID} ;

set1.Dump();
set2.Dump();

set1.Union(set2).Dump();
set1.Concat(set2).Dump();

两个表都有其他列,但匿名类型隐藏了这些。结果:

IOrderedQueryable<> (1 item)  
TestTriggerID 
1


IOrderedQueryable<> (2 items)  
TestTriggerID 
1

2


IOrderedQueryable<> (2 items)  
TestTriggerID 
1

2


IOrderedQueryable<> (3 items)  
TestTriggerID 
1

1

2

你可以看到CONCAT从两个表中复制了1行,而UNION则丢弃了重复的行。

答案 1 :(得分:2)

如果在不同的模式中有两个具有相同名称的表,则可以通过从Table属性中删除模式名称并使用不同的连接字符串重新创建DataContext来实现所需的行为。
如果在同一模式中有两个具有不同名称和相同结构的表,我们不知道将这些表映射到单个类的任何方法。

答案 2 :(得分:1)

一种选择是在服务器上创建一个联合结果的视图(如果仅用于查询)。

对于更新场景,你更加困难,因为LINQ to SQL无法知道要使用哪个表......

答案 3 :(得分:1)

  

Linq-To-Sql可以将它们作为Table使用相同的类对它们进行处理吗?

没有。在同一个DBML文件(同一名称空间)上不能有两个具有相同名称的类。此外,LINQ-to-SQL如何知道如何插入或更新哪个表?

更好的问题是:如果你有两个具有相同模式的表,并且你想将它们一起用作单个集合,为什么不将它们合并到一个表中呢?

答案 4 :(得分:0)

阅读:没问题。查询可以投影到任意类型,LinqToSql将属性名称与列结果匹配。

from c in dc.Customer
where c.Address.StreetName.StartsWith("AB")
select new Person() {Name = c.Name};

通过以下操作枚举时,解析了(如上所述的查询):

  • 生成sql
  • 使用sql字符串和参数documetation调用
  • DataContext.ExecuteQuery<Person>()
    • 将sql发送到数据库并返回datareader。
    • 将datareader传递给DataContext.Translate<Person>() docmentation

在此查询的情况下 - 仅提取Customer.Name列,并且没有新的Customer实例。另请注意 - 如果您有数据加载器,则可以自己致电DataContext.Translate<T>

如果要添加一个类似于单个类型的可查询表的属性,请在部分DataContext文件中执行此操作:

public IQueryable<CustomType> CustomTypeTable
{
  get
  {
    var query = this.Type1Table.Select(t1 => new CustomType{f1 = t1.f1 ... })
      .Concat( this.Type2Table.Select(t2 => new CustomType{f1 => t2.f1 ... })
    return query
  }
}

写作... DataContext中的ObjectTracking是Type和PrimaryKey。每个实例的类型都需要(明确地)映射到数据库中的表。因此,在这些情况下,您不能将1个类型映射到2个表。