繁体   English   中英

如何动态调用 linq 字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM