相关疑难解决方法(0)

使用LINQ/Entity Framework以编程方式链接OrderBy/ThenBy

我有一个报告界面,最终用户可以根据返回的报告的排序顺序选择多个字段.我遇到的问题是我无法真正链接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 entity-framework

13
推荐指数
2
解决办法
7564
查看次数

具有null属性的嵌套属性上的动态linq顺序

我正在使用这个动态的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,而不是数据库相关的.

c# linq linq-expressions

11
推荐指数
2
解决办法
4634
查看次数

具有动态Order By的LINQ查询

我有一个查询,我需要根据查询字符串参数进行ordeby.例如,如果sortby参数是价格,Query需要随价格变化.如果其评级比更改查询按评级排序.

我知道PredicateBuilder可以做And和OR的东西,但我如何进行动态ordeby linq查询.

.net c# linq sql-order-by

9
推荐指数
2
解决办法
9923
查看次数

扩展Marc Gravell的动态Linq OrderBy

我发现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)

c# linq linq-to-objects dynamic sql-order-by

7
推荐指数
1
解决办法
2298
查看次数

JQuery DataTables服务器端分页

在我的web-app中,我使用JQuery DataTables插件来显示从数据库中检索的数据.

我目前正在使用客户端分页,但我的表中的数据正在增长很多,并且在ASP.NET页面中加载现在变得有点慢.所以我打算切换到服务器端分页.

我知道DataTables插件支持它,但搜索我没有发现没有明确实现它.

我的主要疑问是:如果我在服务器端实现分页,我还必须实现排序,或者我可以将它委托给客户端?

你有没有经历过这个?

注意我使用Linq to SQL连接到我的数据库

c# asp.net jquery pagination jquery-datatables

7
推荐指数
2
解决办法
2万
查看次数

linq中的动态排序

请考虑这种情况:

我有一个包含大约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)

它是排序的.问题出在哪儿?

c# linq lambda expression-trees c#-4.0

7
推荐指数
2
解决办法
1万
查看次数

使用多个排序构建表达式

我正在尝试构建一个用于排序的表达式,并且我编写了使用一个属性对列表进行排序的代码.

但我需要首先将其分类为一个属性,其次是另一个属性,依此类推.

我的意思是我想构建一个表达式来实现类似的东西: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)

c# linq lambda expression

7
推荐指数
1
解决办法
1914
查看次数

EF4,Lambda,存储库模式和DTO

我有一个关于Entity Framework4,Lambda表达式和数据传输对象(DTO)的半复杂问题.

所以我有一个小的EF4项目,并遵循既定的OO原则,我有一个DTO,在数据使用者(GUI)和数据模型之间提供一层抽象.

  • 具有getter/setter的VideoDTO = DTO,由GUI使用
  • VideoEntity = EF4生成的实体

我的问题围绕着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,将其作为学习项目.

再次感谢!

linq frameworks entity repository

6
推荐指数
1
解决办法
1043
查看次数

按属性名称(字符串值)排序列表?

我有一份清单object.如何使用属性名称订购此列表?

string orderbyField = "Code";
List<object> l = FillList();
l = l.OrderBy(o => orderbyField);
Run Code Online (Sandbox Code Playgroud)

我可以为此问题进行扩展吗?

c# linq

6
推荐指数
1
解决办法
7945
查看次数

LINQ按名称选择属性

我试图在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)

c# linq expression

6
推荐指数
2
解决办法
5660
查看次数