实体框架中的关系型数据库的布尔函数Linq
本文关键字:布尔 函数 Linq 数据库 关系型 框架 实体 | 更新日期: 2023-09-27 18:02:32
可能我的代码有一些问题,但我主要是有一个语法问题。Entry是在Entries中使用的模型,它包含每个条目的时间戳。Member是分配条目的人员的模型,包含Entry的fk。我想根据成员在给定时间段内(任意选择30天)拥有的条目数对成员列表进行排序。答:我不确定我创建的函数是否正确工作,但这不是重点,因为我还没有真正深入研究它。B.我弄不清楚Linq语句的语法,甚至不知道它是否可能。
功能:
private bool TimeCompare(DateTime TimeStamp)
{
DateTime bound = DateTime.Today.AddDays(-30);
if (bound <= TimeStamp)
{
return true;
}
return false;
}
成员列表:
public PartialViewResult List()
{
var query = repository.Members.OrderByDescending(p => p.Entry.Count).Where(TimeCompare(p => p.Entry.Select(e => e.TimeStamp));
//return PartialView(repository.Members);
return PartialView(query);
}
var查询是我这里的问题,我似乎找不到一种方法来合并布尔函数到linq. where语句。
编辑 总而言之,我只是想查询过去30天内标有时间戳的所有条目。
我还必须强调关系/fk部分,因为它似乎迫使时间戳成为系统的IEnumerable。日期时间,而不是简单的System.Datetime.
在E.TimeStamp:
上出现"Cannot implicit convert timestamp to bool"的错误var query = repository.Members.Where(p => p.Entry.First(e => e.TimeStamp) <= past30).OrderByDescending(p => p.Entry.Count);
操作符'<='的错误不能应用于'System.Collections.Generic '类型的操作数。IEnumerable'和'System. 'DateTime '
var query = repository.Members.Where(p => p.Entry.Select(e => e.TimeStamp) <= past30).OrderByDescending(p => p.Entry.Count);
EDIT2
语法正确但语义不正确:
var query = repository.Members.Where(p => p.Entry.Select(e => e.TimeStamp).FirstOrDefault() <= timeComparison).OrderByDescending(p => p.Entry.Count);
期望的结果是拉出所有成员,然后按它们拥有的条目数排序,这拉出带有条目的成员,然后按它们拥有的条目数排序。实质上。where应该以某种方式嵌套在。count.
中。EDIT3
语法正确,但导致运行时错误(异常详细信息:System。DbSortClause表达式必须具有顺序可比较的类型。参数名称:key):
var query = repository.Members.OrderByDescending(p => p.Entry.Where(e => e.TimeStamp <= timeComparison));
标
更接近(当这行编译时),但它似乎对对象没有任何影响。无论我为一个用户添加多少条目,它都不会改变排序顺序(或者根本不会)。
var timeComparison = DateTime.Today.AddDays(-30).Day;
var query = repository.Members.OrderByDescending(p => p.Entry.Select(e => e.TimeStamp.Day <= timeComparison).FirstOrDefault());
一些研究表明,Linq到实体(IE: This section)
...var query = repository.Members.OrderByDescending(...
如果您使用自己的函数,倾向于真的不喜欢它,因为它将尝试映射到SQL变体。
试着这样做,看看是否有帮助:
var query = repository.Members.AsEnumerable().Where(TimeCompare(p => p.Entry.Select(e => e.TimeStamp).OrderByDescending(p => p.Entry.Count));
编辑:我应该看看你想做什么。您希望它只抓取最近X天内的记录,对吗?我相信下面的工作应该,但我需要测试,当我到我的家庭电脑…
public PartialViewResult List()
{
var timeComparison = DateTime.Today.AddDays(-30);
var query = repository.Members.Where(p => p.Entry.Select(e => e.TimeStamp).FirstOrDefault() <= timeComparison).OrderByDescending(p => p.Entry.Count));
//return PartialView(repository.Members);
return PartialView(query);
}
Edit2:这可能是你的代码缺乏理解,但是e和p是同一类型吗?如果是这样,您应该能够像这样引用时间戳:
public PartialViewResult List()
{
var timeComparison = DateTime.Today.AddDays(-30);
var query = repository.Members.Where(p => p.TimeStamp <= timeComparison).OrderByDescending(p => p.Entry.Count));
//return PartialView(repository.Members);
return PartialView(query);
}
编辑3:在编辑3中,我看到你现在正在努力做什么(我相信)。你很接近了,但是orderbydescent需要走到最后。试试这个:
var query = repository.Members
.Select(p => p.Entry.Where(e => e.TimeStamp <= timeComparison))
.OrderByDescending(p => p.Entry.Count);
谢谢你的帮助,但这是最终的答案:
public PartialViewResult List()
{
var timeComparison = DateTime.Today.AddDays(-30).Day;
var query = repository.Members
.OrderBy(m => m.Entry.Where(e => e.TimeStamp.Day <= timeComparison).Count());
return PartialView(query);
}