Depuis que je ne l'ai pas obtenu une réponse satisfaisante, je vais poster ce que je fini par faire. Je pense que c'est probablement une manière décente, mais il pourrait y avoir d'autres meilleures façons d'atteindre ce que je cherchais (en utilisant la syntaxe de type LINQ sur ma base de données, au lieu d'utiliser des chaînes contenant des requêtes).
Aussi - Je ne suis pas sûr que ce soit plus rapide, puis simplement en utilisant des chaînes de requête. TL; DR: utilisez SQLite.CodeFirst + EntityFramework.
(D'un autre côté, il pourrait être possible d'utiliser LINQ to SQL au lieu de EntityFramework, mais je ne sais pas si c'est aussi une approche CodeFirst.) Je mettrai à jour une fois que j'ai essayé et testé.
chose d'abord, vous devez ajouter ces paquets:
- Entity Framework
- System.Data.SQLite (qui installera probablement aussi :)
- System.Data.SQLite.Noyau
- System.Data.SQLite.EF6
- System.Data.SQLite.Linq
Et enfin, si vous commencez à partir du code (comme moi), vous aurez également besoin
la prochaine chose à faire est de mettre en place la chaîne de connexion dans app.config.
(Sur une note de côté - Il semble y avoir des tonnes de bogues avec les fournisseurs, ce que la désinstallation et la réinstallation des paquets ci-dessus semble corriger. - si vous tenez à ce que je l'ai écrit, c'est ceci:
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
<remove invariant="System.Data.SQLite" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
</DbProviderFactories>
</system.data>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>
</providers>
</entityFramework>
)
La chaîne de connexion doit spécifier un nom, et au moins un chemin où votre fichier DB doit être situé. Vous pouvez également utiliser des chemins relatifs que vous définissez ultérieurement dans le code (en utilisant le | DataDirectory | syntaxe):
<connectionStrings>
<add name="YourModel" connectionString="Data Source=|DataDirectory|\NameOfYourDBFile.sqlite" providerName="System.Data.SQLite" />
</connectionStrings>
L'étape suivante, si vous faites de code d'abord, est la création d'une nouvelle classe qui soit votre modèle, cela utilise essentiellement le paquet SQLite.CodeFirst:
class YourModel : DbContext
{
// Your context has been configured to use a 'YourModel' connection string from your application's
// configuration file (App.config or Web.config). By default, this connection string targets the
// 'YourProject.YourModel' database on your LocalDb instance.
//
// If you wish to target a different database and/or database provider, modify the 'YourModel'
// connection string in the application configuration file.
public YourModel()
: base("name=YourModel")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<YourModel>(modelBuilder);
Database.SetInitializer(sqliteConnectionInitializer);
Database.SetInitializer(new SqliteDropCreateDatabaseWhenModelChanges<YourModel>(modelBuilder));
}
// Add a DbSet for each entity type that you want to include in your model. For more information
// on configuring and using a Code First model, see http://go.microsoft.com/fwlink/?LinkId=390109.
public virtual DbSet<YourTableClass> YourTable { get; set; }
}
[Table("YourTable")]
public class YourTableClass
{
[Key]
public string Id { get; set; }
[Required]
public FileOperation Oper { get; set; }
[Required, Index]
public OperationState State { get; set; }
[Index]
public string Proc { get; set; }
[Required]
public string Src { get; set; }
public DateTime Timestamp { get; set; }
// etc.
}
}
Vous pouvez en lire davantage here.
Et c'est fondamentalement cela avec les préparations.
(Sur une note de côté, si vous voulez changer le chemin relatif au fichier DB à partir du code derrière, vous devez écrire:
AppDomain.CurrentDomain.SetData("DataDirectory", @"the\path\you\desire");
)
Maintenant, vous pouvez simplement utiliser il.La syntaxe de base est très simple, il suffit d'utiliser:
using (var context = new YourModel())
{
// some query
}
Alors Sélectionnez:
using (var context = new YourModel())
{
var t = context.YourTable
.Where(e => e.State == OperationState.BackedUp)
.Select(e => e.Proc)
.Distinct()
}
Si vous voulez Insérer:
using (var context = new YourModel())
{
var e = context.YourTable.Create();
e.Id = guid;
// ...etc
e.Timestamp = timestamp;
context.YourTable.Add(e);
context.SaveChanges();
}
Si vous voulez encore utiliser des requêtes de chaîne:
using (var context = new YourModel())
{
context.Database.ExecuteSqlCommand(comString);
}
Certaines choses importantes à retenir:
- Si vous changez quelque chose dans le DB, vous devez appeler
Context.SaveChange()
à la fin (vous n'avez pas besoin pour ce ExecuteSqlCommand)
- La suppression peut se faire avec RemoveRange + SaveChange() ou en utilisant toujours une chaîne de requête.
Ainsi, l'exemple dans les changements de GetFilterString question à:
public static IQueryable<YourTable> GetFilteredQueryable(IQueryable<YourTable> yourTable)
{
// filter by time
switch (RestoreLogic.WithinTimeBtnStatus)
{
case WithinTime.All:
break;
case WithinTime.Hour:
DateTime offsetHour = DateTime.Now.Add(new TimeSpan(-1, 0, 0));
yourTable = yourTable.Where(e => e.Timestamp >= offsetHour);
break;
// etc.
}
// filter by extension
foreach (var i in FilteredExt)
{
yourTable = yourTable.Where(e => e.Ext != i);
}
// etc.
return yourTable;
}
Eh bien, au moins vous pouvez utiliser les paramètres pour commencer. – Fildor
Et peut-être jeter un oeil à SqlCommandBuilder. – Fildor
Je suppose qu'il veut utiliser LINQ. –