Передать выражение Linq в функцию - PullRequest
1 голос
/ 03 апреля 2012

Я хочу передать список свойств класса в функцию. с помощью функции на основе списка свойств я собираюсь сгенерировать запрос. Как точно такая же функциональность в методе Linq Select. Здесь я собираюсь реализовать это для входной базы данных.

Например,

в начале я хочу запустить выбор как это,

Мой класс сущностей такой же

public class Customer
{
    [System.Data.Linq.Mapping.ColumnAttribute(Name="Id",IsPrimaryKey=true)]
    public string Id { get; set; }

    [System.Data.Linq.Mapping.ColumnAttribute(Name = "Name")]
    public string Name { get; set; }

    [System.Data.Linq.Mapping.ColumnAttribute(Name = "Address")]
    public string Address { get; set; }

    [System.Data.Linq.Mapping.ColumnAttribute(Name = "Email")]
    public string Email { get; set; }

    [System.Data.Linq.Mapping.ColumnAttribute(Name = "Mobile")]
    public string Mobile { get; set; }
}

Я хочу вызвать функцию Select следующим образом:

var result = dataAccessService.Select<Customer>(C=>C.Name,C.Address);

затем, используя результат, я могу получить значения свойств Name и Address.

Я думаю, что моя функция выбора должна выглядеть следующим образом,

(* Я думаю, что это должно быть сделано с помощью выражения Linq. Но я не уверен, что является входным параметром и типом возвращаемого значения. *)

Class DataAccessService
{
   // I'm not sure about this return type and input types, generic types.
   public TResult Select<TSource,TResult>(Expression<Func<TSource,TResult>> selector)
   {
        // Here I wanna Iterate through the property list, which is passed from the caller.
        // Here using the property list, 
        // I can get the ColumnAttribute name value and I can generate a select query.
   }
}

Это попытка создать функциональность, как в Linq. Но я не эксперт в Linq Expressions.

Есть проектный вызов DbLinq из MIT, но это большой проект, и все же я не могу получить от этого ничего полезного.

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

1 Ответ

1 голос
/ 03 апреля 2012

Вы пытаетесь создать новый анонимный тип, состоящий из имени и адреса. Этого легко достичь, используя длинную форму linq (я придумал этот термин из-за отсутствия лучшего объяснения.) Вот пример от Microsoft, ссылка приведена ниже:

public void Linq11() 
{ 
    List<Product> products = GetProductList(); 

    var productInfos = 
        from p in products 
        select new { p.ProductName, p.Category, Price = p.UnitPrice }; 

    Console.WriteLine("Product Info:"); 
    foreach (var productInfo in productInfos) 
    { 
        Console.WriteLine("{0} is in the category {1} and costs {2} per unit.", productInfo.ProductName, productInfo.Category, productInfo.Price); 
    } 
}

Подробности: Linq Select Samples

Обновление: Так вы тогда пытаетесь сделать что-то подобное?

   var result = dataAccessService.Select<Customer>(c => c.Name, c => c.Address);

public object[] Select<TSource>(params Expression<Func<TSource, object>>[] selectors)
   {
       var toReturn = new object[selectors.Count()];

       foreach (var s in selectors)
       {
           var func = s.Compile();
           //TODO: If you implement Select a proper extension method, you can easily get the source
           toReturn[i] = func(TSource);
       }
        return toReturn;
   }

Я не понимаю, почему вы пытаетесь реализовать Select как функцию DataAccessService? Вы пытаетесь создать это как метод расширения? Если это не то, что вы имеете в виду, вам нужно перефразировать ваш вопрос, и, как предложил один комментатор, скажите нам, что вам нужно, а не то, как вы хотите, чтобы мы его разработали.

...