2016-09-01 2 views
0

메서드에 람다 식을 통해 필드를 전달한 다음 해당 필드를 linq 쿼리의 일부로 사용할 수 있습니까?C# lambda 표현 필드를 메서드에 전달하고 linq 쿼리의 필드를 사용합니다.

나는 내가 방법을 작성하는 방법을 모르겠어요

IDictionary<string, string> stuff = foo(items, otherItems, otherItems => otherItems.FieldToUse) 

같은 방법 뭔가를 호출하고 싶지만, 나는 아래의 코드와 같은 종류의를 사용하고자하는 것입니다. 제네릭을 사용할 수 있고 필드 이름 (문자열을 통해)을 메소드에 전달할 수 있지만 다음과 같이 linq 쿼리에서 어떻게 사용할지 모릅니다. 또한 나는 람다 (lambda)를 사용하는 것을 좋아한다. 왜냐하면 내가 선택할 때마다 필드의 이름을 바꿀 수 있기 때문이다.

private IDictionary<string, string> foo<TModel>(IEnumerable<string> items, IEnumerable<TModel> otherItems, object FieldToUse) 
    { 
     //this will return a list of key value pairs of rowIDs and equipment 
     IDictionary<string, string> x = (from o in otherItems 
             join i in items on o.FieldToUse.ToString() equals i //joining on the equipment assetcode 
             select new { rowID = o.RowID, item = i }).ToDictionary(k => k.rowID.ToString(), v => v.item); 
     return x; 
    } 

명확화 : FieldToUse은의 tModel의 속성이나 필드

+0

질문은 매우 명확하지 않다된다. FieldsToUse는 다른 항목의 유형입니까? otherItem을 전달할 때 필드를 전달할 필요가 없습니다. –

+0

TModel에 동일한 유형을 사용하고 있어도 동일한 속성을 사용하여 메소드를 항상 호출하고 싶지는 않습니다. 때로는 하나의 속성과 때로는 다른 속성을 사용하려고합니다. – TruthOf42

+0

선택기를 사용하고 싶습니다. 예를 들어 LINQ OrderBy 메서드를 호출하면 .OrderBy (obj => obj.Property); 그게 니가 찾고있는거야? – mbrdev

답변

3

사용하십시오 Func Delegate

변경 전화

Func<TModel, String> FieldToUse 

하고 LINQ 쿼리 방법 foo는의 마지막 매개 변수 기능

FieldToUse(o) 
,363,210

여기 이것은 당신이 당신은하지만 또 다른 문제가있는 것입니다 그것을

public void DoStuff() 
{ 
    string[] items = { "abc", "def", "ghi" }; 
    List<Model> otherItems = new List<Model> { 
     new Model() { Field1 = "abc", Field2 = "xyz" }, 
     new Model() { Field1 = "abc", Field2 = "xyz" } }; 

    var result = foo<Model>(items, otherItems, a => a.Field2); 
} 

class Model 
{ 
    public string Field1 { get; set; } 
    public string Field2 { get; set; } 
} 

를 사용할 수있는 방법입니다 전체 방법 foo는

private IDictionary<string, string> foo<TModel>(IEnumerable<string> items, 
    IEnumerable<TModel> otherItems, 
    Func<TModel, String> FieldToUse) 
{ 
    //this will return a list of key value pairs of rowIDs and equipment 
    IDictionary<string, string> x = (from o in otherItems 
            join i in items on FieldToUse(o) equals i //joining on the equipment assetcode 
            select new { rowID = o.RowID, item = i }) 
            .ToDictionary(k => k.rowID.ToString(), v => v.item); 
    return x; 
} 

입니다. 일반적인 TModel에는 RowID가 없다. 아마도 TModel에 generic where constraint을 제공 할 것입니다.

코드는 다음

private IDictionary<string, string> foo<TModel>(IEnumerable<string> items, 
    IEnumerable<TModel> otherItems, 
    Func<TModel, String> FieldToUse) where TModel : BaseModel 
{ 
    //this will return a list of key value pairs of rowIDs and equipment 
    IDictionary<string, string> x = (from o in otherItems 
            join i in items on FieldToUse(o) equals i //joining on the equipment assetcode 
            select new { rowID = o.RowID, item = i }) 
            .ToDictionary(k => k.rowID.ToString(), v => v.item); 
    return x; 
} 

class BaseModel 
{ 
    public int RowID { get; set; } 
} 
class Model : BaseModel 
{ 
    public string Field1 { get; set; } 
    public string Field2 { get; set; } 
} 
관련 문제