Как вызвать Expression Func с двумя входными параметрами - PullRequest
0 голосов
/ 12 октября 2018

У меня есть следующий Expression Func, который получает два входных параметра, первый - Person Object, второй - bool и возвращает другой тип Object PersonProfile

private Exression<Func<Person, bool, PersonProfile>> PersonProfileProjection => (person, isValid) =>
        new PersonProfile
        {
             FirstName = person.FirstName,
             HasAddress = isValid ? person.Address1 : null
        };

И я пытаюсь вызвать это при получении таблицы Personиз dbContext.

_dbContext.Persons.Select(PersonProfileProjection); 

Я запутался, как отправить логический параметр внутри PersonProfileProjection.Это работает, когда я ставлю только один вход и один выходной параметр, как это.Но я также хочу дополнительный логический ввод.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Вы можете объявить его как Func вместо выражения:

private Func<Person, bool, PersonProfile> PersonProfileProjection => (person, isValid) =>
        new PersonProfile
        {
            FirstName = person.FirstName,
            HasAddress = isValid // do what you meant to do
        };

... и назвать его как:

_dbContext.Persons.Select(p => PersonProfileProjection(p, true)); 

Вы также можете написать обычныйметод:

private PersonProfile PersonProfileProjection(Person person, bool isValid)
{
    return new PersonProfile
    {
        FirstName = person.FirstName,
        HasAddress = isValid // do what you want to do
    };
}

... и вызывать его так же:

_dbContext.Persons.Select(p => PersonProfileProjection(p, true)); 
0 голосов
/ 12 октября 2018

Вы можете следовать документации Microsoft для этого: Класс выражений

Один пример, созданный для SQLite, который показывает использование функции выше.

public void GetData()
    {
        var connection = new SQLiteConnection(@"Data Source=database.sqlite;Version=3;");
        var context = new DataContext(connection);

        connection.Open();

        var createtableQuery = @"
                                drop table Company;
                                CREATE TABLE[Company]
                                (
                                    [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
                                    [Seats] INTEGER NOT NULL
                                );
                                ";

        var command = new SQLiteCommand(createtableQuery, connection);
        command.ExecuteNonQuery();
        Company com = new Company()
        {
            Id = 6,
            Seats = 7
        };

        context.GetTable<Company>().InsertOnSubmit(com);
        context.SubmitChanges();

        var companies = context.GetTable<Company>();

        foreach (var company in companies)
        {
            Console.WriteLine("Company: {0} {1}",
                company.Id, company.Seats);
        }

        //compile Expression using Compile method to invoke it as Delegate
        Func<int,int, Company> PersonProfileProjectionComp = PersonProfileProjection.Compile();

        var dd = companies.Select(p => PersonProfileProjectionComp(p.Id,p.Seats));

      //// Below line inline use. Both works.
      //var dd = companies.Select(p => PersonProfileProjection.Compile().Invoke(p.Id,p.Seats));
    }

    private System.Linq.Expressions.Expression<Func<int, int, Company>> PersonProfileProjection => (person, seats) =>
    new Company
    {
        Id = person,
        Seats = seats
    };

или в одной строке используйте это: PersonProfileProjection.Compile (). Invoke (person, isValid)

...