实体框架中的关系型数据库的布尔函数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

一些研究表明,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);
    }