Может ли Linq-To-Sql знать о сходстве двух таблиц? - PullRequest
3 голосов
/ 07 октября 2009

Представьте, что в моей базе данных есть 2 таблицы с одинаковой схемой (столбцы, типы и т. Д.) Может ли Linq-To-Sql рассматривать их как Table<AClass>, используя один и тот же класс для них обоих? Как это сделать?

Ответы [ 5 ]

2 голосов
/ 09 октября 2009

Если у вас две таблицы с одинаковыми именами в разных схемах, вы можете добиться необходимого поведения, удалив имя схемы из атрибута Table и воссоздав DataContext с другой строкой соединения.
Если у вас две таблицы с разными именами и одинаковой структурой в одной и той же схеме, мы не знаем способа сопоставить эти таблицы одному классу.

2 голосов
/ 07 октября 2009

Операторы 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 голос
/ 08 октября 2009

Может ли Linq-To-Sql рассматривать их как таблицу, используя для них одинаковый класс?

Нет. Вы не можете иметь два класса с одним и тем же именем в одном файле DBML (одно и то же пространство имен). Кроме того, как LINQ-to-SQL узнает, какую таблицу вставлять или обновлять?

Лучший вопрос: если у вас две таблицы с одинаковой схемой и вы хотите использовать их вместе как одну коллекцию, почему бы не объединить их в одну таблицу?

1 голос
/ 08 октября 2009

Один из вариантов - создать представление на сервере, объединяющее результаты, если оно предназначено только для запроса.

Для сценария обновления вы застряли, так как LINQ to SQL не сможет узнать, какую таблицу использовать ...

0 голосов
/ 08 октября 2009

Для чтения: это не проблема. Запрос может проецироваться в произвольные типы, и LinqToSql сопоставит имена свойств с результатами столбцов.

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

A (такой запрос, как приведенный выше) разрешается при перечислении следующих операций:

  • sql производится
  • DataContext.ExecuteQuery<Person>() вызывается с этой строкой sql и параметрами documentmetation
    • sql отправляется в базу данных, и читатель возвращается.
    • Читатель данных передается в DataContext.Translate<Person>() Документация .

В случае этого запроса - выбирается только столбец 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
  }
}

Для записи ... ObjectTracking в DataContext по типу и PrimaryKey. Тип каждого экземпляра необходим (однозначно) для сопоставления с таблицей в базе данных. Таким образом, в этих сценариях нельзя использовать карту типа 1 для двух таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...