Linq通过变量访问属性

时间:2012-01-07 15:49:57

标签: c# linq where

假设我有一个类:

public class Foo
{
    public string Title {get;set;}
}

现在,让我们假设我有一个public List<Foo> myList,我希望Linq过滤它:

var x = myList.Where(f => f.Title == myValue);

直到现在,一切都很美好。

但是如何通过变量访问属性?类似的东西:

string myProperty = "Title";

var x = myList.Where(f => f.myProperty == myValue);

5 个答案:

答案 0 :(得分:15)

您可以编写扩展方法

public static class MyExtensions
{
    public static object GetProperty<T>(this T obj, string name) where T : class
    {
        Type t = typeof(T);
        return t.GetProperty(name).GetValue(obj, null);
    }
}

并像这样使用

var x = myList.Where(f => f.GetProperty("Title") == myValue);

答案 1 :(得分:3)

这不是LINQ用于的情况类型。 LINQ是一个用于操作集合的流畅界面。通过文本表示访问成员是通过反射完成的。

object GetProperty(Foo f, string propertyName) {
  var type = typeof(Foo);
  var propInfo = type.GetProperty(propertyName);
  return propInfo.GetValue(f, null);
}

答案 2 :(得分:2)

如果您需要动态地动态撰写查询,可以使用LINQ Dynamic Query库,这是Microsoft的一个示例:

  

此示例显示了一种用于组合LINQ语句的技术   在运行时动态飞行。

在代码中引用库:

using System.Linq.Dynamic;

您的查询将如下所示:

// You can use a string as the argument for the Where method
// meaning you can compose this string dynamically
string myProperty = "Title";
var x = myList.Where(myProperty + " = " + myValue);

也可以在查询字符串中使用占位符,这有点提高了可读性:

var x = myList.Where("@0 = @1", myProperty, myValue);

另请参阅Scott Guthrie的这篇文章:动态LINQ第1部分:Using the LINQ Dynamic Query Library我认为没有第2部分......

注意:您必须从Microsoft编译示例代码并引用构建的程序集,或者您可以将代码包含在您自己的项目中。

答案 3 :(得分:2)

我知道这是一个旧线程,但这是另一种方法。如果您需要在循环中执行此操作,则具有显着更快的优点。我已经将结果从“func”转换为对象,使其更具通用性。

        var p = Expression.Parameter(typeof(string));
        var prop = Expression.Property(p, "Length");
        var con = Expression.Convert(prop, typeof(object));
        var exp = Expression.Lambda(con, p);
        var func = (Func<string, object>)exp.Compile();

        var obj = "ABC";
        int len = (int)func(obj);

在最初的问题中,代码在linq中使用,所以速度可能很好。如果构造正确,也可以在where子句中使用“func”direct,例如

        class ABC
        {
            public string Name { get; set; }
        }

        var p = Expression.Parameter(typeof(ABC));
        var prop = Expression.Property(p, "Name");
        var body = Expression.Equal(prop, Expression.Constant("Bob"));
        var exp = Expression.Lambda(body, p);
        var func = (Func<ABC, bool>)exp.Compile();

        ABC[] items = "Fred,Bob,Mary,Jane,Bob".Split(',').Select(s => new ABC() { Name = s }).ToArray();
        ABC[] bobs = items.Where(func).ToArray();

答案 4 :(得分:0)

你不能使用linq dynamic query from microsoft 这是示例代码

 var query =  db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
            OrderBy("CompanyName").
            Select("New(CompanyName as Name, Phone)");