Повторное использование кода Linq to SQL с помощью entityframework - PullRequest
0 голосов
/ 05 декабря 2018

В настоящее время я занимаюсь рефакторингом кода, который делает мое приложение очень медленным.Я довольно далеко, но мне все еще не хватает некоторых частей головоломки, надеюсь, вы мне поможете.

Мне нравится многократно использовать код Linq to SQL внутри моего проекта.Это мой способ сделать это в данный момент:

public DomainAccount GetStandardUserAccount()
{
    return  this.DomainAccounts.Where(da => da.DomainAccountType == DomainAccountType.Standarduser).First() as DomainAccount;
}

var CurrentSituation = _context.Employees.ToList().Where(e => e.GetStandardUserAccount().Username.Contains("test")).ToList();

Небольшое уточнение: у каждого сотрудника есть несколько учетных записей домена, где одна всегда является стандартной учетной записью домена (DomainAccountType).

Поскольку Linq можетНе преобразовывать метод C # в sqlstatement (Eventho - это только linq to sql code). Мне нужно сначала преобразовать dbset в список, чтобы я мог использовать GetStandardUserAccount ().Этот код работает медленно из-за всего этого преобразования базы данных.Есть ли способ, которым я могу повторно использовать linq для кода SQL, не превращая его в метод?Я прочитал некоторые темы, и это то, что я получил до сих пор:

Func<Employee, DomainAccount> GetStandardDomainAccount = x => x.DomainAccounts.FirstOrDefault(d => d.DomainAccountType == DomainAccountType.Standarduser);
var TheGoal = _context.Employees.Where(e => e.GetStandardDomainAccount().Username.Contains("Something")).ToList();

1 Ответ

0 голосов
/ 05 февраля 2019

Ответ на этот вопрос немного сложнее, чем кажется.Чтобы позволить linq выполнять код C #, вам нужно сделать функцию выражением, чтобы вход и выход интерпретировались не как код, а как некоторый смысл.Решение выглядит так:

 private Expression<Func<TPeople, bool>> GetDefaultDomainAccount<TPeople>(Func<DomainAccount, bool> f) where TPeople : Person
        {
            return (a) => f(a.DomainAccounts.FirstOrDefault(d => d.DomainAccountType == DomainAccountType.Standarduser));
        }

Теперь код можно назвать uppon следующим образом:

    public IQueryable<TPeople> GetPeopleByUsername<TPeople>(string username) where TPeople : Person
    {
        GetPeople<TPeople>().Where(GetDefaultDomainAccount<TPeople>(d => d.Username == username));
        return people;
    }

вместо этого:

        public IQueryable<TPeople> GetPeopleByUsername<TPeople>(string username) where TPeople : Person
    {
        username = username.ToUpper();
        var people = GetPeople<TPeople>()
            .Where(a => a.DomainAccounts.FirstOrDefault(d => d.DomainAccountType == DomainAccountType.Standarduser).Username.ToUpper().Contains(username));

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