我的上下文类看起来是这样的:
public virtual DbSet<MyTableItem> MyTableItems { get; set; }
public virtual DbSet<MyTableProduct> MyTableProducts { get; set; }
public virtual DbSet<MyTableKid> MyTableKids { get; set; }
这些表格都有不同的列。
我想创建一个扩展方法来检查名称是否已经存在,如果它存在,它将增加它,以便它为我提供特定列的唯一名称。因此,如果我为具有item_name列的MyTableItem调用它,它将查看item_name列的值,对于MyTableProduct表,它将在prod_name列中查找,等等。
这是我目前的方法:
public static string GetUniqueName<T>(this DbContext db, Expression<Func<T, bool>> filter, string columnName, string defaultName) where T : class
{
var counter = 0;
var source = Expression.Parameter(typeof(T), "source");
var nameFilter = Expression.Lambda<Func<T, bool>>(Expression.Equal(Expression.Property(source, columnName), Expression.Constant(defaultName)), source);
while (db.Set<T>().Where(nameFilter).FirstOrDefault() != null)
{
counter++;
nameFilter = Expression.Lambda<Func<T, bool>>(Expression.Equal(Expression.Property(source, columnName), Expression.Constant(defaultName + " (" + counter + ")")), source);
}
return defaultName + " (" + counter + ")";
}
这有效,但是我不喜欢这是整个dbContext类的扩展方法。我认为如果每个表都更好。
答案 0 :(得分:0)
为什么不在IQueryable本身上创建扩展方法?像这样:
public static string GetUniqueName<T>(this IQueryable<T> query,
Expression<Func<T, string>> nameSelector, string prefix)
{
var lastName = query.Select(nameSelector)
.Where(x => x.StartsWith(prefix))
.OrderByDescending(x => x.Length)
.ThenByDescending(x => x)
.FirstOrDefault();
return prefix + (GetCounter(lastName) + 1);
}
public static int GetCounter(string name)
{
if (string.IsNullOrEmpty(name))
{
return 0;
}
// Implement the retrieval of the counter from the name
throw new NotImplementedException();
}
我不知道您想对数据施加什么限制,所以我假设除了自动生成的名称之外没有其他名称以默认前缀开头,以保持简单。