Zamiast DataAdapter/DataTable można użyć jednej z istniejących bibliotek DAL dla .NET Core, które obsługują operacje CRUD za pośrednictwem niskopoziomowych interfejsów ADO.NET. Niedawno opublikowałem NReco.Data: niezależny od dostawcy DAL, który obsługuje automatyczne generowanie instrukcji SQL, abstrakcyjne zapytania i proste operacje zapisu CRUD.
Na przykład fragment kodu z pytaniem może być przepisany w następujący sposób:
var con = new SqlConnection(m_ConnectString);
var dbFactory = new NReco.Data.DbFactory(
System.Data.SqlClient.SqlClientFactory.Instance);
var dbCmdBuilder = new NReco.Data.DbCommandBuilder(dbFactory);
var dbAdapter = new NReco.Data.DbDataAdapter(con, dbCmdBuilder);
var selectRecordsList = dbAdapter.Select(
new Query("some_table")).ToList<Dictionary<string,object>>();
złożonych zapytań SQL mogą być wykonywane jako widoków danych na poziomie aplikacji:
dbCmdBuilder.Views["some_view"] = new DbDataView(
@"SELECT @columns FROM Employee emp
LEFT JOIN Company c ON (c.Id=emp.CompanyId)
@where[ WHERE {0}] @orderby[ ORDER BY {0}]
") {
FieldMapping = new Dictionary<string,string>() {
{"Id", "emp.Id"},
{"*", "emp.*, c.Title as CompanyTitle"}
}
};
var someViewRS = dbAdapter.Select(new Query("some_view")).ToRecordSet();
NReco.Data nie próbuje zamieniać SQL z własnym zapytaniem (jak robi LINQ); zamiast tego pozwala tworzyć proste zapytania niezależne od bazy danych z logiki biznesowej i zawierać złożoną składnię SQL ze specjalnymi widokami danych na poziomie aplikacji, które są dostępne jak tabele tylko do odczytu.
Ponadto jest możliwe określenie zapytań SQL surowego bezpośrednio Select
metodą przeciążenia (jak FromSql EF rdzenia):
var userModels = dbAdapter.Select("select * from users where id={0}", 5).ToList<User>();
Cóż, można zacząć od spojrzenia na źródła odniesienia dla [SqlDataAdapter] (http://referencesource.microsoft.com/#System.Data/System/Data/SqlClient/SqlDataAdapter.cs) i [DataTable ] (http://referencesource.microsoft.com/#System.Data/System/Data/DataTable.cs) i ponownie zaimplementuj części, których faktycznie potrzebujesz ... także: powodzenia. – Corak
Dziękuję za odpowiedź, ale nie wiem, jak bardzo to pomaga. Przyjąłem, że wielu innych dotknęłoby ten problem, i że nie wszyscy zamierzają go naprawić poprzez wdrożenie części ram. – Hughgo
Cóż, jednym problemem jest to, że jeśli .Net Core nie wie o 'DataTable', to nie możesz' zwrócić dt' i wszystko inne, co działałoby z 'DataTable' nie będzie już działać. Pytanie brzmi więc, jakiej funkcjonalności "DataTable" naprawdę potrzebujesz i możesz użyć na przykład 'DataReadera' zamiast tego (jeśli' DataReader' jest dostępny w .Net Core, nigdy nie pracował z tym). – Corak