Как программно выбрать столбец, который запрашивает Linq, используя PropertyInfo? - PullRequest
0 голосов
/ 27 марта 2010

Я хотел бы контролировать, как Linq запрашивает мою базу данных программно. Например, я бы хотел запросить столбец X , столбец Y или столбец Z , в зависимости от некоторых условий.

Прежде всего, я создал массив всех свойств внутри моего класса с именем myPropertyInfo.

Type MyType = (typeOf(MyClass));
PropertyInfo[] myPropertyInfo = myType.GetProperties(
BindingFlags.Public|BindingFlags.Instance);

Массив myPropertyInfo позволяет мне получить доступ к каждой детали свойства (Name, propertyType и т. Д.) Через индекс [i].

Теперь, как я могу использовать вышеуказанную информацию для управления тем, как Linq запрашивает мою БД?

Вот пример запроса, который я хотел бы использовать.

var myVar = from tp in db.MyClass
            select tp.{expression};

Выражение , используя myPropertyInfo[i], чтобы выбрать, какое свойство (столбец) запрашивать.

Я не уверен, так ли это, но если есть другой способ, я буду рад узнать.

EDIT :

Мне кажется, правильное выражение - то, что использовал @Gabe. На самом деле, я хотел бы делать запросы на лету. Вот причина: у меня есть (i) таблица Organizations (министерства, посольства, международные организации, такие как ООН, СОООН, ЮНИСЕФ, Всемирный банк и т. Д., И службы в зависимости от них). У меня есть (ii) другая таблица Hierarchy, которая показывает, как эти организации связаны, начиная с того, к какой категории принадлежит каждая из них (правительство, иностранные представительства, частный сектор, НПО и т. Д.)

В каждом столбце, представляющем уровень в иерархии, некоторые строки будут длиннее, а другие - короче. Столбцы многих строк будут иметь одинаковое значение (например, 2 министерства, принадлежащие правительству, будут иметь значение «Правительство» в качестве значения для столбца «Уровень 1»).

Вот почему для каждой строки (организации) мне нужно переходить уровень за уровнем (то есть столбец за столбцом).

Надеюсь, на этот раз я был достаточно откровенен

Спасибо за помощь.

Ответы [ 2 ]

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

если вы используете Entity Framework, а не LINQ to SQL, есть замечательный Entity Sql и вы можете использовать его как

object DynamicQuery(string fieldName, object fieldValue) {
    string eSql=string.Format("it.{0} = @param", fieldName);
    return db.Where(eSql, fieldValue).FirstOrDefault();
}

надеюсь, это поможет

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

using (AdventureWorksEntities advWorksContext =
        new AdventureWorksEntities())
{
    try
    {
        // Use the Select method to define the projection.
        ObjectQuery<DbDataRecord> query =
            advWorksContext.Product.Select("it.ProductID, it.Name");

        // Iterate through the collection of data rows.
        foreach (DbDataRecord rec in query)
        {
            Console.WriteLine("ID {0}; Name {1}", rec[0], rec[1]);
        }
    }
    catch (EntitySqlException ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

Также вы можете даже сделать следующее (снова из MSDN)

using (AdventureWorksEntities advWorksContext =
    new AdventureWorksEntities())
{
    string myQuery = @"SELECT p.ProductID, p.Name FROM 
        AdventureWorksEntities.Product as p";
    try
    {
        foreach (DbDataRecord rec in
            new ObjectQuery<DbDataRecord>(myQuery, advWorksContext))
        {
            Console.WriteLine("ID {0}; Name {1}", rec[0], rec[1]);
        }
    }
    catch (EntityException ex)
    {
        Console.WriteLine(ex.ToString());
    }
    catch (InvalidOperationException ex)
    {
        Console.WriteLine(ex.ToString());
    }
}
0 голосов
/ 28 марта 2010

Звучит так, будто вы хотите сделать Queryable на лету. Я не пробовал, но это может дать вам начало:

var myVar = 
Queryable.Select(
    db.MyClass, 
    Expression.Property(
        Expression.Parameter(
            typeof(MyClass), // this represents the type of "tp"
            "tp"
        ),
        myPropertyInfo[i]
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...