通过查询获取订单中特定ID的位置

时间:2014-10-23 15:44:19

标签: c#

我需要在c#中进行查询,以按日期的表顺序获取特定ID的位置。

我的表结构

IdAirport   bigint
IdUser  int
AddedDate   datetime

数据:

2   5126    2014-10-23 14:54:32.677
2   5127    2014-10-23 14:55:32.677
1   5128    2014-10-23 14:56:32.677
2   5129    2014-10-23 14:57:32.677

例如,我需要知道IdAser = 5129的IdUser = 5129,由AddedDate asc命令。 (在这种情况下的结果将是3)。

编辑:

我正在使用像这样的iQueryable:

AirPort airport =(机场作为上下文。机场选择机场).FirstOrDefault();

谢谢你的时间!

3 个答案:

答案 0 :(得分:2)

使用LINQ:如果要查找任意顺序中元素的索引,可以使用OrderBy()TakeWhile()Count()

 db.records.Where(x => x.IdAirport == airportId)
           .OrderBy(x => x.AddedDate)
           .TakeWhile(x => x.IdUser != userId)
           .Count() + 1;

答案 1 :(得分:1)

这是一个快速的:

public class test
{
    public int IdAirport;
    public int IdUser;
    public DateTime AddedDate;

    public test(int IdAirport, int IdUser, DateTime AddedDate)
    {
        this.IdAirport = IdAirport;
        this.IdUser = IdUser;
        this.AddedDate = AddedDate;
    }
}

    void Main()
    {
        List<test> tests = new List<test>()
    {
    new test(2,   5126,    DateTime.Parse("2014-10-23 14:54:32.677")),
    new test(2,   5127,    DateTime.Parse("2014-10-23 14:55:32.677")),
    new test(1 ,  5128 ,   DateTime.Parse("2014-10-23 14:56:32.677")),
    new test(2  , 5129  ,  DateTime.Parse("2014-10-23 14:57:32.677"))
    };

        var r = tests
        .Where(t => t.IdAirport == 2)
        .OrderBy(t => t.AddedDate)
        .TakeWhile(t => t.IdUser != 5129)
        .Count() + 1;

        Console.WriteLine(r);
    }

它保留了您自己列表的确切顺序。如果您愿意,可以修改Where / OrderBy,有趣的部分是在“TakeWhile / Count”中使用。

应该可以正常工作,但对于长列表可能效率不高。

编辑:似乎和Ian Mercer一样。但是我需要自己的样本中的“+ 1”,因为TakeWhile将返回跳过的项目的数量,因此不是好的项目的位置。或者我没有把问题搞定。

答案 2 :(得分:-1)

这应该做你需要的:

dataTable.Rows.IndexOf(
    dataTable.AsEnumerable().OrderBy(
    x => x["AddedDateColumn"]).First(
    x => (int)(x["IdUserColumn"]) == 5129));