Как инициализировать пустую временную переменную, не имея прямого доступа к ее типу - PullRequest
0 голосов
/ 29 марта 2012

Предположим, у меня есть следующий класс и объекты:

class Product
{ 
   public int ProductId { get; set; }
   public string ProductDesc { get; set; }
} 

string[] keywordArray = new string []{"A", "B", "C", "D"};    

var products = repository.GetAllProducts();

Я использую var, потому что GetallProducts() возвращает IQueryable<Product>, но я не могу "увидеть" тип Product, поскольку он определен в моем DAL.

Теперь мне нужна временная переменная tempResult для хранения временных результатов в foreach. Например:

foreach(var keyword in keywordArray)
{
    tempResult = tempresult.Union(products.Where(p => p.ProductDesc.Contains(keyword)));
}

Если я объявлю var tempResult внутри foreach, она будет перезаписываться на каждой итерации (и это даст ошибку времени компиляции , потому что ее нельзя использовать до инициализация).

Поэтому мне нужно инициализировать его за пределами foreach. Если я использую:

var tempResult = products;

Внутри моего foreach Я просто подвожу ко всему набору свой желаемый результат. Набор.

Поэтому только два возможных решения:

1) Создайте метод в репозитории, который возвращает пустой IQueryable<Product> ( фабричный шаблон )

2) Использовать отражение (если возможно, еще не уверен)

Я нашел оба решения немного "грязными". Есть ли другой подход / шаблон для достижения этой цели? Спасибо

Ответы [ 4 ]

2 голосов
/ 29 марта 2012

Ваш код должен иметь возможность "видеть" тип Product, поскольку вы обращаетесь к ProductDesc и т. Д.

Вам просто нужно добавить оператор использования для пространства имен вашего DAL или, в худшем случае, установить tempResult в Enumerable.Empty<My.DAL.Namespace.Product>();

Создание целого метода только для того, чтобы избежать ссылки на пространство имен, не нужно; использование отражения еще хуже.

Если подумать, просто позвоните

var notTempResult = keywordArray.SelectMany(
    kw => products.Where(p => p.ProductDesc.Contains(kw)).Distinct();

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

0 голосов
/ 29 марта 2012

Может быть, вы можете использовать выражение linq и не должны использовать никакую временную переменную.

 var result = products.Where(p => keywordArray.Contains(p.ProductDesc));
0 голосов
/ 29 марта 2012

Один из вариантов - объявить ваш tempResult как IList и использовать .ToList () для объединения IEnumerable.

        string[] keywordArray = new string[] {"A", "B", "C", "D"};

        var products = repository.GetAllProducts();

        IList<Product> tempResult = new List<Product>();
        foreach (var keyword in keywordArray)
        {
            //declared because of access to modified closure issue.
            string keyword1 = keyword;
            tempResult = tempResult.Union(products.Where(p => 
               p.ProductDesc.Contains(keyword1))).ToList();
        }
0 голосов
/ 29 марта 2012
Dynamic tempResult = null;

foreach(var keyword in keywordArray)
{

    if (tempResult == null) {
        tempResult = products.Where(p => p.ProductDesc.Contains(keyword));
    }
    else {

        tempResult = tempresult.Union(products.Where(p => p.ProductDesc.Contains(keyword)));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...