【问题标题】:LINQ checking if an ICollection<int> has any crossover with c# arrayLINQ 检查 ICollection<int> 是否与 c# 数组有任何交叉
【发布时间】:2015-04-28 17:43:25
【问题描述】:

所以我有一个包含整数的 c# 数组。

在我的数据库中,我有一个名为 request 的实体。 Request 与名为 Weeks 的表具有一对多的关系。周内有一个 requestID 和一周(因此第 1 周的值为 1,第 2 周 -> 2 等)。

我需要构造一个 where 子句,如果数据库记录与我的 c# 数组有任何重叠,它将获取该记录。

例如,假设一个请求在数据库中连接到它的第 1、2、3 周,而我的 c# 数组有 [3,5,6],我希望拉取该请求。

关于如何完成这项工作的任何想法?

这是我目前的 LINQ 代码

    IQueryable<request> proposedRequest = db.requests.Include(r => r.rooms);
        proposedRequest = proposedRequest.Where(r=>r.booked.Equals(1));
        proposedRequest = proposedRequest.Where(r => r.roundID.Equals(roundID));
        proposedRequest = proposedRequest.Where(r=>r.day.Equals(day));
        proposedRequest = proposedRequest.Where(s=>s.start<time+length && s.start + s.length > time);
        //I attempted something here but obviously it doesnt work
        proposedRequest = proposedRequest.Where(r=>weeks.Contains(r.weeks_request.Any(f=>f.week)));

所以在我的请求表中有一个属性周。这是 1 或 0。如果是 1,这意味着请求是针对一组标准的周,即 1-12。这意味着该请求的weeks_request 表中没有条目。

如果 week 属性为 0,这意味着它是第 1-16 周的任何排列,而不是标准的 1-12。因此,对于所选的每一周,weeks_request 表中都有一个单独的条目。

数组周包含用户想要预订的周数。但显然,如果已经预订,他们就无法预订一周。因此,我需要查找它是否已被预订。

有什么想法吗?

【问题讨论】:

  • 如果将r=&gt;weeks.Contains(r.weeks_request.Any(f=&gt;f.week)) 更改为r=&gt;r.weeks_request.Any(f=&gt;weeks.Contains(f.week)) 会发生什么?
  • 我相信这可能会奏效,我试一试并回复您。 @JasonBoyd
  • 我在我的一个数据库上测试了类似的东西,它似乎有效,所以我继续发布它作为可能的答案。
  • 我在测试它时遇到了麻烦。在我的数据库中,request.weeks 为 0 或 1。如果为 1,则表示选择的周数为 1、2、3...、12。如果为 0,则表示在 week_request 表中存在包含所选周的条目,因此 1-16 的任何排列(例如)但不是 1,2,3...,12。这还能用吗?
  • @JasonBoyd 我在上面添加了一些额外的信息,希望你能帮助我。

标签: c# asp.net-mvc database linq


【解决方案1】:

尝试改变:

r=&gt;weeks.Contains(r.weeks_request.Any(f=&gt;f.week))

收件人:

r=&gt;r.weeks_request.Any(f=&gt;weeks.Contains(f.week))

根据更新后的问题进行更新

我不完全确定我是否遵循您的操作,但请尝试以下查询:

IQueryable<request> proposedRequest = 
    db.requests.Include(r => r.rooms)
    .Where(r => 
        r.booked.Equals(1) &&
        r.roundID.Equals(roundID) &&
        r.day.Equals(day) &&
        r.start < time + length && 
        r.start + r.length > time &&
        ((r.week == 0 && weeks.Any(w => w <= 12) 
            || (r.week == 1 && r.weeks_request.Any(w => weeks.Contains(w.week));

【讨论】:

    猜你喜欢
    • 2015-11-21
    • 2021-04-15
    • 2016-05-28
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    相关资源
    最近更新 更多