Возвращаемое выражение> где Т может быть нескольких разных типов - PullRequest
0 голосов
/ 15 ноября 2018

Мне нужно взять предметы из таблицы X и найти их по свойству B

Как я могу сделать это динамически? потому что я так тяжело борюсь с типами

Я думал о чем-то вроде кода ниже и реализации интерфейса для всех этих типов пользователя / автомобиля / компании это будет "указывать" на желаемое свойство (имя / модель / название компании)

Извините, если я не выразил себя должным образом, я надеюсь, что код покажет проблему лучше.

public IActionResult test(string type, string value)
{
    var exp = GetExpression(type, value);

    return View(GetCount(exp));
}

public Expression<Func<???, bool>> GetExpression(string type, value)
{
    switch (type)
    {
        case "User":
        return x => x.FirstName == value;

        case "Car":
        return x => x.Model == value;   

        case "Company":
        return x => x.CompanyName == value;

        default:
        return null;
    }
}

public int GetCount(Expression<Func<???, bool>> exp, ??? Table)
{
    return _context.Table.Where(exp).Count();
}

public class User
{
    public string FirstName { get; set; }
}

public class Company
{
    public string CompanyName { get; set; }
}   

С интерфейсом:


public interface IExpressionable
{
    public string Helper;
}

public class User : IExpressionable
{
    public string FirstName { get; set; }
    public string Helper => FirstName;
}

public class Car : IExpressionable
{
    public string Model { get; set; }
    public string Helper => Model;
}   

public class Company: IExpressionable
{
    public string CompanyName { get; set; }
    public string Helper => CompanyName ;
}   

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

1) Один из способов достижения вашей цели -

public class User
{
    public string FirstName { get; set; }
}

public class Car
{
    public string Model { get; set; }
}

public class Company
{
    public string CompanyName { get; set; }
}

2) Создайте один общий метод для получения счетчика из базы данных, например

public int GetCountFromDB<TEntity>(Expression<Func<TEntity, bool>> exp) where TEntity : class
{
    return _context.Set<TEntity>().Where(exp).Count();
}

3) Создайте другой метод дляопределите, какая сущность должна быть передана вышеприведенному универсальному методу.

public int? GetCount(string type, string value)
{
    switch (type)
    {
        case "User":
            return GetCountFromDB<User>(x => x.FirstName == value);

        case "Car":
            return GetCountFromDB<Car>(x => x.Model == value);

        case "Company":
            return GetCountFromDB<Company>(x => x.CompanyName == value);

        default:
            return null;
    }
}

4) А затем вы можете использовать вышеуказанный метод в вашем методе действия, например

public IActionResult test(string type, string value)
{
    int? count = GetCount(type, value);
    return View(count);
}
0 голосов
/ 15 ноября 2018

Я полагаю, вы ищете что-то вроде этого:

public class User : IHasKey
{
    public string FirstName { get; set; }
    public string Key => FirstName;
}

public class Car : IHasKey
{
    public string Model { get; set; }
    public string Key => Model;
}

public class Company : IHasKey
{
    public string CompanyName { get; set; }
    public string Key => CompanyName;
}

public interface IHasKey
{
    string Key { get; }
}

public class DataContext : DbContext
{
    public DbSet<Car> Cars { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<Company> Companies { get; set; }

    public IEnumerable<IHasKey> GetByKey<T>(string value) where T: class, IHasKey
    {
        return this.Set<T>().Where(obj => obj.Key == value);
    }
}

Может использоваться следующим образом:

db.GetByKey<Car>("BMW");
db.GetByKey<Company>("Microsoft");
0 голосов
/ 15 ноября 2018

Если вы пытаетесь смешать это:

_context.Users.Where(x => x.FirstName == value).Count();
_context.Cars.Where(x => x.Model == value).Count();
_context.Companies.Where(x => x.CompanyName == value).Count();

до:

_context.Table.Where(exp).Count();
// or
_context.Table.Count(exp);

Я рекомендую вам не делать этого.Это делает ваш код таким же сложным, как и читаемый.Потому что:

  • _context.Table: какая таблица?

  • Where(exp) или Count(exp): почему нам нужно преобразовать type вFirstName, Model или CompanyName внутри exp?У нас есть другой способ присвоения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...