Использование Field <> с Linq to SQL - PullRequest
3 голосов
/ 14 августа 2011

Я пытаюсь передать имя столбца в класс и получить значение для этого столбца из базы данных SQL. Похоже, что Field <> недоступен для таблицы, но он будет работать с DataTable. Может кто-нибудь указать мне, как я могу сделать это с помощью Linq? Я уверен, что это очень простая вещь. Спасибо.

[Table(Name = "[Keys]")]
public class Keys
{
    [Column]
    public string Column_A{ get; set; }
    [Column]
    public string Column_B{ get; set; }
    [Column]
    public string Column_C{ get; set; }
}

    public string ReadKey(string DBKey)
{
    DataContext dc = new DataContext(sqlconn);
    Table<Keys> keysTable = dc.GetTable<Keys>();

    var query = from k in keysTable.AsEnumerable()
    select k.Field<string>("DBKey");     <---------------- wrong

}

Ответы [ 2 ]

3 голосов
/ 14 августа 2011

Field<> предназначен для LINQ to DataTables и включен в качестве расширения System.Data. Это не стандартный метод расширения LINQ. См. Этот вопрос о том, как использовать LINQ to DataTables .

То, что вы пытаетесь сделать, можно выполнить с помощью выражения или Dynamic LINQ . Динамический LINQ не является частью того, что поставляется с .NET; он был включен в качестве примера в VS2008, и люди продолжают использовать его. Я не уверен, что это поддерживается, обновляется и т. Д. Microsoft. Я бы на это не рассчитывал, пока он не войдет в рамки.

Вы можете создать метод для создания selector, упомянутого в ответе Джона, следующим образом:

public Expression<Func<Keys,T>> GetSelectLambda<T>(string propertyName)
{
    ParameterExpression lhsParam = Expression.Parameter(typeof(Keys), "s");
    Expression fieldParam = Expression.Property(lhsParam, propertyName);
    var theExpression = Expression.Lambda<Func<Keys, T>>(fieldParam, lhsParam);
    return theExpression;
}

Таким образом, передача GetSelectLambda<string>("DBKey") должна генерировать лямбду s => s.DBKey, которая затем возвращается и передается методу Джона.

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

2 голосов
/ 14 августа 2011

Обычно вы не должны использовать столбец name с LINQ to SQL - одно из преимуществ LINQ to SQL по сравнению с использованием нетипизированных DataTable объектов состоит в том, что вы получаете большую безопасность во время компиляции.

Если вам нужно разрешить выбор разных столбцов, вы можете использовать дерево выражений для их выбора:

public string ReadKey(Expression<Func<Keys, string>> selector)
{
    DataContext dc = new DataContext(sqlconn);
    Table<Keys> keysTable = dc.GetTable<Keys>();

    // Generally speaking you don't want to use AsEnumerable here...
    var query = keysTable.Select(selector);
    // Now do something with query
}

Обратите внимание, что использование GetTable означает редко большойидея - обычно вы работаете с определенной таблицей на конкретном DataContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...