想象一下,我的数据库中有2个表,具有相同的模式(列,类型等)。 Linq-To-Sql可以使用相同的类将它们视为Table<AClass>
吗?怎么做?
答案 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};
通过以下操作枚举时,解析了(如上所述的查询):
DataContext.ExecuteQuery<Person>()
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个表。