2011-08-14 3 views
3

클래스에 열 이름을 전달하고 해당 열 값을 SQL 데이터베이스에서 검색하려고합니다. Field <>은 테이블에서는 사용할 수 없지만 DataTable에서는 사용할 수 있습니다. 누군가가 어떻게 linq을 사용하여 할 수 있습니까? 나는 그것이 매우 단순한 것이라고 확신한다. 감사.Field <> With Linq to SQL

[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 

} 

답변

3

Field<>는 DataTables에 LINQ위한 것이며, 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의 람다를 생성한다.

희망이 도움이됩니다.

+0

도움 주셔서 감사합니다. – Gary

+0

기꺼이 도와 드리겠습니다. –

2

당신은 일반적으로 SQL에 LINQ와 열 이름을 사용하지 말아야합니다 - 하나를 LINQ의 이익이 지정되지 않은 DataTable 객체를 사용하는 것이 더 컴파일시 안전을 얻을 수 있다는 것입니다을 통해 SQL로. 당신은 다른 열을 선택할 수 있도록해야하는 경우

, 당신이 그들을 선택하는 식 트리를 사용할 수 있습니다 GetTable를 사용하여 거의 좋은 생각이다

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 
} 

주 - 일반적으로 함께 작업 줄을 특정 테이블 DataContext.

+0

좋아요! 그것은 마침내 작동합니다. 고마워요! – Gary