首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Linq to entity怎么动态的根据任一字段进行排序

2012-08-01 
Linq to entity如何动态的根据任一字段进行排序?如题,我想用Linq查询数据,并根据前台传过来的Entity的一个

Linq to entity如何动态的根据任一字段进行排序?
如题,我想用Linq查询数据,并根据前台传过来的Entity的一个属性进行排序。

  例如:
  Student类有Name和Age,前台将属性名(name或age)传到后台,如何组装Linq?


  还有一个问题是我想用获得对象某个属性在数据库中的不同的值,distinct怎么用,属性是动态的,也是接受对象的属性名来完成操作。

[解决办法]

C# code
string s="name";if(s=="name"){var q =( from e in db.Student orderby e.name select e.name).Distinct(); }else if(s=="age"){  var q = (from e in db.Student orderby e.age select e.age).Distinct();;}
[解决办法]
public class Person
{
public string FirstName { set; get; }
public string LastName { set; get; }
public bool sex { get; set; }
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
List<Person> classes1 = new List<Person>();
classes1.Add(new Person() { FirstName = "Kim", LastName = "Tom", sex = true });
classes1.Add(new Person() { FirstName = "Kim", LastName = "Tom1", sex = true });
classes1.Add(new Person() { FirstName = "Kim", LastName = "Tom2", sex = true });
classes1.Add(new Person() { FirstName = "Kim", LastName = "Tom3", sex = true });
classes1.Add(new Person() { FirstName = "Kim", LastName = "Tom4", sex = true });
classes1.Add(new Person() { FirstName = "Kyo", LastName = "Jerry", sex = false });
classes1.Add(new Person() { FirstName = "Kyo", LastName = "Jerry1", sex = false });
classes1.Add(new Person() { FirstName = "Kyo", LastName = "Jerry2", sex = false });
classes1.Add(new Person() { FirstName = "Kyo", LastName = "Jerry3", sex = false });
classes1.Add(new Person() { FirstName = "Kyo", LastName = "Jerry4", sex = false });
classes1.Add(new Person() { FirstName = "Kyo", LastName = "Jerry5", sex = false });

var childern = from child in classes1.Where<Person>(p => p.GetType().GetProperty("FirstName").GetValue(p, null).ToString() == "Kim") select child;

foreach (Person p in childern)
{
MessageBox.Show(p.LastName);
}

}
我试验了下 貌似没有问题啊, 对linq 不熟,感觉你的问题还是出在数据的结构上, 再仔细看看吧 哈哈
[解决办法]
如果字段太多,建议你先做一个Dictionary来确定Lambda表达式
例子:
 public class PeopleCntorl
{
public Dictionary<string, IEnumerable<people>> Dic;
public PeopleCntorl()
{
List<people> peoples = new List<people>() 
{
new people{ID=0, Name="Rose", Age=21 }, 
new people{ID=1, Name="Jack", Age=23 },
new people{ID=2,Name="Mike",Age=29}
};

Dic = new Dictionary<string, IEnumerable<people>>();

IEnumerable<people> people=from x in peoples
select x.Name;
IEnumerable<people> people2 = from x in peoples
select x.Age;
Dic.Add("1", people);
Dic.Add("2", people2);
}

public IEnumerable<people> GetEnumerable(string name)
{
IEnumerable<people> iEnumerale=Dic[name];


return iEnumerale;
}
}
此时如果要获取不同字段,只要修改Dictionary里面的表达式就行了。
[解决办法]

C# code
 /// <summary>    /// 排序方式    /// </summary>    public enum SortKind    {        /// <summary>        /// 升序        /// </summary>        ASC = 0,        /// <summary>        /// 降序        /// </summary>        DESC    }    /// <summary>    /// 排序查询    /// </summary>    public class QuerySort    {        /// <summary>        /// 将实体对象集合按字段排序        /// </summary>        /// <typeparam name="T">实体对象类型</typeparam>        /// <param name="list">实体对象集合</param>        /// <param name="field">排序字段</param>        /// <param name="kind">排序方式</param>        /// <returns>排序后的集合</returns>        public static List<T> Sort<T>(List<T> list, string field, SortKind kind)        {            if (list != null)            {                switch (kind)                {                    case SortKind.ASC: list = list.OrderBy(t => GetValue(t,field)).ToList(); break;                    case SortKind.DESC: list = list.OrderByDescending(t => GetValue(t, field)).ToList(); break;                }            }            return list;        }        /// <summary>        /// 动态获取如model对象中的XX对象的XX属性        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="model"></param>        /// <param name="field"></param>        /// <returns></returns>        private static object GetValue<T>(T model, string field)        {            if (field.Split('.').Length == 1)                return model.GetType().GetProperty(field).GetValue(model,null);            int index = field.IndexOf('.');            string f1 = field.Substring(0, index);            string f2 = field.Substring(index+1);            object obj = model.GetType().GetProperty(f1).GetValue(model, null);            return GetValue(obj, f2);        } 

热点排行