我有一个报告界面,最终用户可以根据返回的报告的排序顺序选择多个字段.我遇到的问题是我无法真正链接OrderBy/ThenBy方法,因为我正在迭代排序字段列表.我在想这样的事情:
foreach (string sort in data.SortParams)
{
switch (sort)
{
case "state":
query = query.ThenBy(l => l.RegionCode);
break;
case "type":
query = query.ThenBy(l => l.Type);
break;
case "color":
query = query.ThenBy(l => l.Color);
break;
case "category":
query = query.OrderBy(l => l.Category);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
(注意:为了简单起见,我已经删除了开关,确定这是否是第一个排序项.)
有关如何迭代集合以确定排序顺序的任何想法?
我正在使用这个动态的linq orderby函数,我从这里得到了.
这适用于嵌套属性,所以我可以这样做:
var result = data.OrderBy("SomeProperty.NestedProperty");
Run Code Online (Sandbox Code Playgroud)
问题是,如果SomeProperty为null,那么在NestedProperty上执行OrderBy会抛出臭名昭着的"对象引用未设置为对象的实例".
我的猜测是我需要自定义以下行来处理异常:
expr = Expression.Property(expr, pi);
// Or
LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);
Run Code Online (Sandbox Code Playgroud)
我考虑创建一个语句体,在最坏的情况下我可以使用try catch,但这不起作用,因为你不能在orderby linq语句中使用语句体:"带有语句体的lambda表达式无法转换为表达树"
我迷失在这里,有关如何实现这一目标的任何建议?
顺便说一句,这是针对Linq to Objects,而不是数据库相关的.
我有一个查询,我需要根据查询字符串参数进行ordeby.例如,如果sortby参数是价格,Query需要随价格变化.如果其评级比更改查询按评级排序.
我知道PredicateBuilder可以做And和OR的东西,但我如何进行动态ordeby linq查询.
我发现Marc Gravell的动态秩序很棒:
IEnumerable <T>上的动态LINQ OrderBy
我把它放在课堂上了LinqHelper.在这个类中我还创建了两个新类,因此在我的代码中我可以这样做:
var q = db.tblJobHeaders;
LinqHelper.OrderByCollection OBys = new LinqHelper.OrderByCollection();
OBys.AddOrderBy("some field", true);
OBys.AddOrderBy("anotherfield", false);
OBys.ExecuteOrderBys(q);
Run Code Online (Sandbox Code Playgroud)
实现这一目标的课程是:
/// <summary>
/// A collection of order bys
/// </summary>
public class OrderByCollection
{
private ArrayList Orderings = new ArrayList();
public OrderByCollection(){ }
/// <summary>
/// Add an order by to this collection
/// </summary>
public void AddOrderBy(string Field, bool Descending)
{
OrderByObj NewObj = new OrderByObj(Descending, Field);
this.Orderings.Add(NewObj);
}
/// <summary>
/// Executes the order …Run Code Online (Sandbox Code Playgroud) 在我的web-app中,我使用JQuery DataTables插件来显示从数据库中检索的数据.
我目前正在使用客户端分页,但我的表中的数据正在增长很多,并且在ASP.NET页面中加载现在变得有点慢.所以我打算切换到服务器端分页.
我知道DataTables插件支持它,但搜索我没有发现没有明确实现它.
我的主要疑问是:如果我在服务器端实现分页,我还必须实现排序,或者我可以将它委托给客户端?
你有没有经历过这个?
注意我使用Linq to SQL连接到我的数据库
请考虑这种情况:
我有一个包含大约50个字段的类的列表.我想要一个用户可以根据字段列表进行排序的Combobox.例如,如果用户选择"F1"列表,则根据"F1"排序.
我不想if-else为每个领域排序.我看到这个主题:
但我无法使用它的答案.我如何才能Expression Tree用于此目的?
编辑1):
据亲爱的@Thom Smith回答,我写了这段代码:
using (NorthwindModel1.NorthwindEntities2 ent = new NorthwindModel1.NorthwindEntities2())
{
var query = from o in ent.Orders
where o.OrderID < 10257
select o;
query.OrderBy("CustomerID", SortDirection.Ascending);
GridView1.DataSource = query;
GridView1.DataBind();
}
Run Code Online (Sandbox Code Playgroud)
但它没有排序.如果我用这种方式编写代码:
GridView1.DataSource = query.OrderBy(o=>o.CustomerID);
Run Code Online (Sandbox Code Playgroud)
它是排序的.问题出在哪儿?
我正在尝试构建一个用于排序的表达式,并且我编写了使用一个属性对列表进行排序的代码.
但我需要首先将其分类为一个属性,其次是另一个属性,依此类推.
我的意思是我想构建一个表达式来实现类似的东西:students.OrderBy(fistExpression.Compile()).ThenBy(secondImpression.Complie()).ThenBy(thirdExpression.Compile()).
那么如何动态地放置那些ThenBy方法呢?
这是我的代码:
Type studentType = typeof(Student);
ParameterExpression studentParam = Expression.Parameter(studentType, "x");
MemberInfo ageProperty = studentType.GetProperty("Age");
MemberExpression valueInNameProperty =
Expression.MakeMemberAccess(studentParam, ageProperty);
Expression<Func<Student, int>> orderByExpression =
Expression<Func<Student, int>>.Lambda<Func<Student, int>>(valueInNameProperty, studentParam);
var sortedStudents = students.OrderBy(orderByExpression.Compile());
Run Code Online (Sandbox Code Playgroud) 我有一个关于Entity Framework4,Lambda表达式和数据传输对象(DTO)的半复杂问题.
所以我有一个小的EF4项目,并遵循既定的OO原则,我有一个DTO,在数据使用者(GUI)和数据模型之间提供一层抽象.
我的问题围绕着GUI使用DTO(并没有让GUI完全使用Entity),并且需要将lambda传递给数据层.我的数据层是Add的基本存储库模式.更改,删除,获取,获取列表等.尝试使用如下签名实现Find方法:
public IEnumerable<VideoDTO> Find(Expression<Func<VideoEntity, bool>> exp)
...
_dataModel.Videos.Where(exp).ToList<Video>()
---
Run Code Online (Sandbox Code Playgroud)
我的问题/关注点是"exp"需要是VideoEntity而不是VideoDTO.我想保留关注点的分离,以便GUI不知道Entity对象.但是,如果我试图传入
Func<VideoDTO, bool>
Run Code Online (Sandbox Code Playgroud)
然后我不能使用实际的数据模型在那个表达式上做LINQ.
有没有办法将a转换Func<VideoDTO,bool>为aFunc<VideoEntity, bool>
理想情况下,我的方法签名会接受Func<VideoDTO, bool>,这样GUI就不会引用底层数据实体.
这够清楚了吗?谢谢你的帮助
谢谢你们两个人的代表.
我将尝试在对象中定义搜索条件并在LINQ表达式中使用它.刚开始使用EF4和L2S,将其作为学习项目.
再次感谢!
我有一份清单object.如何使用属性名称订购此列表?
string orderbyField = "Code";
List<object> l = FillList();
l = l.OrderBy(o => orderbyField);
Run Code Online (Sandbox Code Playgroud)
我可以为此问题进行扩展吗?
我试图在LINQ select语句中使用变量.
这是我现在正在做的一个例子.
using System;
using System.Collections.Generic;
using System.Linq;
using Faker;
namespace ConsoleTesting
{
internal class Program
{
private static void Main(string[] args)
{
List<Person> listOfPersons = new List<Person>
{
new Person(),
new Person(),
new Person(),
new Person(),
new Person(),
new Person(),
new Person(),
new Person(),
new Person(),
new Person(),
new Person()
};
var firstNames = Person.GetListOfAFirstNames(listOfPersons);
foreach (var item in listOfPersons)
{
Console.WriteLine(item);
}
Console.WriteLine();
Console.ReadKey();
}
public class Person
{
public string City { get; set; }
public …Run Code Online (Sandbox Code Playgroud) linq ×9
c# ×8
expression ×2
lambda ×2
sql-order-by ×2
.net ×1
asp.net ×1
c#-4.0 ×1
dynamic ×1
entity ×1
frameworks ×1
jquery ×1
pagination ×1
repository ×1