Que diriez-vous à l'aide d'une méthode d'extension comme ceci:
public static T FirstOrCreate<T>(this IEnumerable<T> source) where T : class, new()
{
var result = source.FirstOrDefault();
return result != null ? result : new T();
}
Si vous voulez qu'il soit capable d'accepter un prédicat, vous pouvez utiliser ce d éfinition:
public static T FirstOrCreate<T>(this IQueryable<T> source, Expression<Func<T, bool>> predicate) where T : class, new()
{
var result = source.FirstOrDefault(predicate);
return result != null ? result : new T();
}
De cette façon, vous pouvez l'utiliser à la place de FirstOrDefault() comme ceci:
Invoice selectedInvoice = (from i in Invoices
where i.ID == invoiceID
select i).FirstOrCreate();
..ou avec l'utilisation d'un prédicats:
Invoice selectedInvoice = db.Invoices.FirstOrCreate(i => i.ID == invoiceID);
Est-ce que ce soit renvoie une entité correspondante ou une nouvelle entité (non nulle) à la place. Edit: J'ai pensé à cela aujourd'hui, et je me rends compte que ce qui précède vous obligera à détecter que l'entité est nouvelle (non existante) et l'attacher au DataContext, donc je suis venu avec cette compromis, en utilisant la même approche:
public static T FirstOrCreate<T>(this IEnumerable<T> source, DataClassesDataContext db) where T : class, new()
{
var result = source.FirstOrDefault();
if (result == null)
{
result = new T();
db.GetTable<T>().InsertOnSubmit(result);
}
return result;
}
l'inconvénient est que vous devez passer le DataContext en tant que paramètre, mais il devrait fonctionner assez bien:
Customer selectedCustomer = (from c in db.Customers
where c.CustomerId == selectedCustomerId
select c).FirstOrCreate(db);
Sûrement un upvote est là-bas? :)
Cela définira toujours la propriété "Number" sur l'entité, la marquant comme sale.Cela peut/va vous donner des mises à jour inutiles lors de l'exécution de SubmitChanges() –