Как определить положение переменной SELECT LINQ Query - PullRequest
0 голосов
/ 01 февраля 2011

Можно ли сделать LINQ SELECT более гибким, работая не со свойствами, а с именем столбца?Может быть, пример поможет .. Я пытаюсь сделать следующее (псевдокод):

From x In Entities
Where ...
Select("ID", "Value" , "Date")

, но в зависимости от определенных вариантов я бы хотел получить результат в другом порядке

From x In Entities
Where ...
Select("Value", "Date", "ID" )

Или другое количество результатов SELECT

From x In Entities
Where ...
Select("Value")

Любая помощь, чтобы сделать это как можно более динамичной, была бы УДИВИТЕЛЬНОЙ!Тпй

Ответы [ 2 ]

1 голос
/ 01 февраля 2011

Может быть, это поможет вам

from x In Entities
where ... select new {
  Value = x["Value"],
  Date = x["Date"],
  ID = x["ID"]
}
0 голосов
/ 02 февраля 2011

Как я уже говорил в своем комментарии (обрабатывает подвойства, например Type.Name, но не несколько полей), я позволил себе сделать версию с несколькими полями;)

public static class DynamicLinkExtensions
{    
    public static IEnumerable<dynamic> Select<T>(this IQueryable<T> source, string memberAccess)
    {
        var propNames = memberAccess.Split('.');
        var type = typeof(T);
        var props = new List<PropertyInfo>();

        foreach (var propName in propNames)
        {
            var prop = type.GetProperty(propName);
            props.Add(prop);
            type = prop.PropertyType;
        }
        return source.Select(props.ToArray());
    }

    public static IEnumerable<dynamic> Select<T>(this IQueryable<T> source, PropertyInfo[] props)
    {
        var parameter = Expression.Parameter(typeof(T));
        var member = Expression.MakeMemberAccess(parameter, (MemberInfo)props.First());

        for (var i = 1; i < props.Length; i++)
        {
            member = Expression.MakeMemberAccess(member, (MemberInfo)props[i]);
        }

        Expression<Func<T, object>> expression = Expression.Lambda<Func<T, object>>(member, new[] { parameter });
        return source.Select(expression);
    }
}

Использование:

var names = DataContext.Customers.Select("Name").Cast<string>().ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...