为所有实体创建扩展方法

时间:2018-03-07 20:42:01

标签: c# entity-framework

我的上下文类看起来是这样的:

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类的扩展方法。我认为如果每个表都更好。

1 个答案:

答案 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();
}

我不知道您想对数据施加什么限制,所以我假设除了自动生成的名称之外没有其他名称以默认前缀开头,以保持简单。