簡體   English   中英

使用LINQ將變量值用作字段

[英]Use variable value as field with LINQ

我有這個對象:

public class MyObject
{
    public int Id { get; set; }
    public string FieldA { get; set; }
    public string FieldB { get; set; }
    public string FieldC { get; set; }
    public string FieldD { get; set; }
}

我有一個IList <>這個對象:

IList<MyObject> MyListObject = new List<MyObject>();

我對此執行Linq查詢:

var result = (from p in MyListObject where p.FieldC == "Test" select p.FieldA);

在這種情況下,我返回“ p.FieldA”,但有時我需要返回“ p.FieldB”。 我想將字段名稱(FieldA或FieldB)放在這樣的變量中

var myvar = "FieldB"
var result = (from p in MyListObject where p.FieldC == "Test" select p.????);

如何在Linq查詢中使用myvar內容(FieldB)作為字段名稱?

謝謝,

如果您的方法本身知道必須在FieldA和FieldB之間進行選擇,則可以使用:

var whatField = "FieldA";
var result = (from p in MyListObject 
     where p.FieldA == "Test" 
     select (whatField == FieldA ? p.FieldA : p.FieldB));

如果您有2個以上的選項,我會選擇傳遞一個lambda。

Func<MyObject, object> fieldGetter;

// Option A, switch
switch (whatField) {
   case "FieldA": fieldGetter = o => o.FieldA; break;
   case "FieldB": fieldGetter = o => o.FieldB; break;
   // More options
}

// Option B using reflection:
var t = typeof(MyObject);
var prop = t.GetProperty(whatField);
fieldGetter = o => prop.GetValue(o, null);

// Linq then looks like
var result = (from p in MyListObject 
     where p.FieldA == "Test" 
     select fieldGetter(p));

使用lambda的優點是,您可以拆分邏輯,拆分哪個字段以及如何查詢。 您甚至可以使其適用於不同類型:

IEnumerable<T> Query<T>(IQueryable<MyObject> MyListObject, Func<MyObject, T> fieldGetter) {
  return result = (from p in MyListObject 
       where p.FieldA == "Test" 
       select fieldGetter(p));
}

// call using:

var result = Query(MyListObject, o => o.FieldA);

FieldA和FieldB是同一類型嗎?

如果是,那么您可以執行以下操作:

var result = (from p in MyListObject where p.FieldA == "Test" 
             select (condition ? p.FieldA : p.FieldB));

您可以使用反射根據屬性的名稱獲取屬性的值。 這將允許您從類中選擇任何屬性。

這是在MyObject類上使用擴展方法的示例:

    public static string GetPropertyValue(this MyObject myObj, string propertyName)
    {
        var propInfo = typeof(MyObject).GetProperty(propertyName);

        if (propInfo != null)
        {
            return propInfo.GetValue(myObj, null).ToString();
        }
        else
        {
            return string.Empty;
        }
    }

您的LINQ查詢將如下所示:

string propName = "FieldB";
var result = from m in myList where m.FieldC == "Test" select m.GetPropertyValue(propName);

如果希望它與IQueryable一起使用,則可以執行以下操作:

var filtered = MyListObject.Where(p => p.FieldA == "Test");

var results = condition ? filtered.Select(p => p.FieldA) : filtered.Select(p => p.FieldB);

可以重構為:

Expression<Func<MyObject,string>> selector;

switch(condition)
{
    case "FieldA": selector = o => o.FieldA; break;
    case "FieldB": selector = o => o.FieldB; break;
    // other cases here
    default: throw new NotImplmentedException();
}

var results = MyListObject.Where(p => p.FieldA == "Test").Select(selector);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM