INSERT INTO SecondTable(Col1,Col2)
SELECT Col5,Col6
FROM FirstTable ft
LEFT JOIN SecondTable st ON st.Col1 = ft.Col1
WHERE st.Col1 IS NULL AND ft.RecType = 'ABC'
Я не знаю, точно ли это, что Вы хотите, но можно хотеть смотреть на код Витрины Rob Conery MVC. Он использует вариант шаблона репозитория с linq поставщиком. Он отображает LINQ на объекты Sql к объектам области и затем возвращает объекты области от поставщика репозитория к уровню служб, который переносит поставщика, разрешающего ему работать некоторая логика над данными, возвращенными, прежде чем это поразит бизнес-слой.
Мне это кажется, что Вы хотите, чтобы поставщики возвратили DTOs, и затем Вы хотите отобразить DTOs на объекты области в репозитории/уровне служб. Если это верно, Вы могли отобразить свой LINQ на поставщика SQL к DTOs, иметь его, возвращают их, затем отображают DTOs на объекты области в репозитории/уровне служб. Это должно работать просто великолепно, но это может стать утомительным, поскольку у Вас теперь было бы 2 отображающихся слоя.
В этом случае Вы имели бы: ProductService, который берет IProductRepository. Это вызывает методы на IProductRepository для возвращения DTOs. Это затем отображает DTOs на реальные бизнес-объекты и возвращает их коду вызова.
Можно создать внешний XML-файл, отображающий базу данных на любой класс:
<?xml version="1.0" encoding="utf-8"?>
<Database Name="DbName"
xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
<Table Name="DbTableName">
<Type Name="EntityClassName" >
<Column Name="ID" Type="System.Int64" Member="Id"
DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true"
CanBeNull="false" />
<Column Name="ColumnName" Type="System.String" Member="PropertyA"
DbType="VarChar(1024)" CanBeNull="true" />
</Type>
</Table>
</Database>
И затем передайте XML классу DataContext:
using (var cn = GetDbConnection())
{ var mappingSrc = XmlMappingSource.FromReader(xmlReader);
using (var db = new DataContext(cn, mappingSrc))
{ var q = from entity in db.GetTable<EntityClassName>()
where entity.PropertyA = "..."
select entity.ID;
}
}
Я нашел фантастическое сообщение в блоге (с большим количеством хорошего кода) об этом здесь: http: // iridescence.no/post/Linq-to-Sql-Programming-Against-an-Interface-and-the-Repository-Pattern.aspx
Я думаю, что Вы хотите ПОСТЕПЕННО (Простые Объекты CLR) поддержку. LINQ к SQL имеет адаптер по имени Close2Poco.
Но я советовал бы переключаться на Платформу Объекта, в данный момент они также имеют ПОСТЕПЕННО адаптер, но в v2 его ожидаемый, который будет поддерживаться из поля.
Вы не должны использовать LINQ для сгенерированного кода SQL, можно украсить собственные классы необходимым ColumnAttributes или использовать внешний XML отображающийся файл.
Самый простой путь состоял бы в том, чтобы отделить Ваши объекты от datacontext: загрузите необходимый объект, отделите его от DataContext, используйте его однако, Вы любите, позже используете Присоединение () для связи его с DataContext для сохранения.
Печально LINQ не имеет никакого метода для отделения объектов от datacontext, но можно просто клонировать их, который работает приятно. Самый простой путь был бы чем-то вроде этого:
public static T CloneEntity<T>(T source)
{
DataContractSerializer dcs = new DataContractSerializer(typeof(T));
using (Stream stream = new MemoryStream())
{
dcs.WriteObject(stream, source);
stream.Seek(0, SeekOrigin.Begin);
return (T)dcs.ReadObject(stream);
}
}
Я сделал что-то похожее с WCF
1 На Вашем DBML, набор Вы режим Serialization к Однонаправленному
2 столбца Set ALL на Ваших таблицах к UpdateCheck=false
3 Записи Ваш сервис что-то как следующее:
public class Service1 : IService1
{
public Company GetCompany(int companyId)
{
using (DataClasses1DataContext dc = new DataClasses1DataContext())
{
return (from c in dc.Companies where c.CompanyId == companyId select c).Single();
}
}
public void SaveCompany(Company company)
{
using (DataClasses1DataContext dc = new DataClasses1DataContext())
{
dc.Companies.Attach(company, true);
dc.SubmitChanges();
}
}
public void InsertCompany(Company company)
{
using (DataClasses1DataContext dc = new DataClasses1DataContext())
{
dc.Companies.InsertOnSubmit(company);
dc.SubmitChanges();
}
}
}
4 Добавляют сервисную ссылку
Не точно тот же сценарий, но я работаю для создания инструмента пользователя, который на основе XML-файла генерирует модель OO. Мой подход должен использовать LINQ для SQL позади сцены и так как я генерирую код автоматически, это было бы просто в использовании другой механизм для скажем, источника данных MySQL. Так как это не поддерживается LINQ к SQL, необходимо будет написать код доступа к данным вручную, но клиентский код, который будет использовать модель OO, изменится всегда.
Ваши классы Объекта могли реализовать IProduct, IUser, IOrder и т.д. взаимодействует через интерфейс, который был бы объявлен в Вашем блоке "Интерфейсов"? Таким образом, ссылки интерфейса IRepository только интерфейсы бизнес-объекта (т.е. наборы возвратов IProduct и т.д.) и блок "Интерфейсов" отделяются от Ваших других определенных для реализации блоков.