我需要在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();
谢谢你的时间!
答案 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));