2015-05-09 3 views
0

Мне нужно создать общую процедуру в visual studio, чтобы получить некоторые параметры в качестве входных данных и вернуть список, полученный в репозитории. Я использую Linq. Но я не уверен, как развить эту функцию, и ни ключевые слова, которые я могу использовать, и не найти некоторые ресурсы.Как разработать общий метод для операторов linq?

Это пример кода, который уже используется в моей программе:

var lstReceiptDetails = Repository<TransactionDetail>() 
    .Where(current => current.HeaderId == headerId) 
    .OrderBy(current => current.DocumentRow) 
    .ToList(); 

мне нужно изменить вышеуказанное заявление Linq к чему-то вроде следующего псевдокода:

private List<> GetQuery(repositoryName, conditionFieldName, orderFieldName) 
{ 
var lstResult = Repository<repositiryName>() 
    .Where(current => current.ConditionFieldName == conditionFieldName) 
    .OrderBy(current => current.orderFieldName) 
    .ToList(); 

Return(lstResult); 
} 

Любая помощь оценить , Maryam

+1

мы говорим о Linq или Linq-на-SQL/EntityFramework? – Caramiriel

+1

Что касается использования общего –

+0

Если ваш список был DataTable, вы могли бы использовать .Field («Название столбца»), что сделало бы код более гибким. – jdweng

ответ

0

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

Образца ПОКО объект:

class TransactionDetail 
{ 
    public DateTime DateProcessed { get; set; } 
    public string AccountName { get; set; } 
} 

Хранилище:

abstract class GenericRepository<T> 
{ 
    public List<T> GetQuery<TKey>(
     Func<T, bool> conditionFieldName, 
     Func<T, TKey> orderFieldName) 
    { 
     var lstResult = Repository() 
      .Where(conditionFieldName) 
      .OrderBy(orderFieldName) 
      .ToList(); 

     return lstResult; 
    } 

    private IEnumerable<T> Repository() 
    { 
     throw new NotImplementedException(); 
    } 
} 

class TransactionDetailRepository : GenericRepository<TransactionDetail> 
{ 
} 

И Вызывающая сторона:

var repository = new TransactionDetailRepository(); 

var transactions = repository.GetQuery(
    x => x.AccountName == "Foo Bar", 
    x => x.DateProcessed); 

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

Если этот кусок кода должен быть использован в EntityFramework или Linq к SQL, параметры должны быть завернуты в Expression<T> таким образом, что, например: Func<T, bool> становится Expression<Func<T, bool>>

+0

Общий параметр 'T' помещается в' GenericRepository', поэтому нет необходимости повторять его, когда кто-то вызывает метод GetQuery. «TKey» может быть выведен из параметров, что упрощает вызов метода. – Caramiriel

0

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

Краткое пример:

var result = Repository<repositoryName>(). 
    Where("Id = 1"). 
    Select("new(Id, Name)"); 

Более подробная информация здесь: http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library