Передача лямбда-выражения в качестве параметра - PullRequest
0 голосов
/ 08 апреля 2011

У меня есть несколько таблиц с одинаковым столбцом domainID, который в основном просто контролирует, какие данные отображаются на каком веб-сайте, поскольку они совместно используют базу данных.

Так что, когда я иду ктаблица для элемента управления Мне нужно было бы создать большой переключатель для обработки различных запросов LINQ.Я хотел бы создать служебный метод, который принимает тип таблицы в качестве параметра, а затем возвращает предложение where на основе столбца в переданной таблице.

public static IEnumerable<T> ExecuteInContext<T>(
               IQueryable<T> src)
        {
             int domain = 1;//hard coded for example

             return src.Where(x => x.DomainID == domain);//Won't work, has to be a way to do this.            
        }

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

Я пытаюсь вызвать первый метод, подобный этому:

using (DataClasses1DataContext db = new DataClasses1DataContext())
        {

            var q = Utility.ExecuteInContext(db.GetTable<item>());

            Repeater1.DataSource = q;
            Repeater1.DataBind();
        }

Надеюсь, это объясняет, что я пытаюсь сделать.

Редактировать: Ответ BrokenGlass решил мою проблему.Я хотел бы добавить, что вам нужно открыть файл .dbml.cs и расширить таблицу / класс своим интерфейсом.Я также хотел указать, что проект не будет построен, если мой столбец будет обнуляемым, в нем говорится, что это не тот тип возвращаемого значения, что и мой интерфейс.

Ответы [ 4 ]

3 голосов
/ 08 апреля 2011

Вы должны ограничить свой T классом со свойством DomainID - вы можете добавить эти реализации интерфейса в частичные классы, расширяющие вашу модель данных.

public interface IFoo
{
    int DomainId { get; set; }
}
..

public static IQueryable<T> ExecuteInContext<T>(IQueryable<T> src) where T: IFoo
{
  int domain = 1;//hard coded for example
  return src.Where(x => x.DomainID == domain);
}
2 голосов
/ 08 апреля 2011
Expression pe = Expression.Parameter(typeof(T));
Expression prope = Expression.Property(pe, "DomainID");
Expression ce = Expression.Equals(prope, 
    Expression.Constant((int)1);

Expression<Func<T,bool>> exp =
Expression.Lambda<Func<T,bool>>(
    ce, pe);

return query.Where(exp);
0 голосов
/ 08 апреля 2011

Я не уверен, что понимаю, что вы имеете в виду, но, возможно, вы хотите добавить предложение where:

public static IEnumerable<T> ExecuteInContext<T>(IQueryable<T> src)     

     where T: MyType //MyType exposing your DomainId   
    {             
       int domain = 1;//hard coded for example            
        return src.Where(x => x.DomainID == domain);//Won't work, has to be a way to do this.                    
    }
0 голосов
/ 08 апреля 2011

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

public static IEnumerable<T> ExecuteInContext<T>(IQueryable<T> src)
{
    int domain = 1;//hard coded for example

    return src.Where(x => ((T)x).DomainID == domain);
}

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

Например:

public static IEnumerable<T> ExecuteInContext<T>(IQueryable<T> src) where T : IMyDomainObject
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...