[英]How do you call linq fields dynamically
如果我傳入一個字符串列名,如何按屬性名稱調用不同的項目列表?
private myEntities db = new myEntities();
...
//function passes in string
var vals = db.myEntityClass
.Select(v => v.????).Distinct() //I want this to be selected dynamically
你可以試試這個
(p => p.GetType().GetProperty(exp).GetValue(p, null)).ToString();
如果您使用的是 .NET 4.0,這里是 David Fowler 的一篇文章,它利用新的動態類型功能創建了一個 DynamicQueryable 和 DynamicExpressionBuilder,它允許您動態引用實體屬性。
或者..如果您更願意直接了解它,他還創建了一個庫http://bitbucket.org/dfowler/dynamiclinq封裝了功能。 它也在 NuGet 上:)
您可以做的一件事是使用擴展方法來獲取我寫了一個快速示例的屬性,但是您需要為您的數據添加額外的完整性檢查,但這是基本情況。
static class BadIdea
{
public static Typ GetValue<Typ>(this object o, string PropName)
{
Type T = o.GetType();
Typ ret = default(Typ);
System.Reflection.PropertyInfo pi = T.GetProperty(PropName);
if (pi != null)
{
object tempRet = pi.GetValue(o, new object[] { });
ret = (Typ)Convert.ChangeType(tempRet, ret.GetType());
}
else
{
return default(Typ);
}
return ret;
}
public class Tst
{
public int A { get; set; }
public int B { get; set; }
}
static void Main(string[] args)
{
List<Tst> vals =new List<Tst>() { new Tst() { A = 4, B = 6 }, new Tst() { A = 4, B = 7 } };
var lst = vals.Where((x) => x.GetValue<int>("A") == 4);
foreach (Tst ot in lst)
{
Console.WriteLine("A : {0} ; B: {1}", ot.A, ot.B);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.