C# 如何基于BookID获取表中的大数

C# 如何基于BookID获取表中的大数,c#,oracle,entity-framework,linq,C#,Oracle,Entity Framework,Linq,我有一张这样的桌子 ID BookID Sunday Monday Tuesday Wednesday Thursday Friday 001 B200 50 40 60 80 90 10 002 B200 10 20 40 50 80 30 003 B200 70 80 10 20

我有一张这样的桌子

ID  BookID  Sunday  Monday  Tuesday Wednesday   Thursday    Friday

001 B200    50      40      60      80           90           10
002 B200    10      20      40      50           80           30
003 B200    70      80      10      20           30           50
004 B500    40      50      90      10           60           40
005 B500    10      5       40      70           40           10
006 B500    50      40      50      40           100          50
007 B500    60      25      15      20           10           60
我需要根据
bookID
获取最大行数。根据这张表,

例:

  • 当BookID=B200时,最大值应为90
  • 当BookID=B500时,最大值应为100
如何使用基于
BookID
的C#LINQ查询获取此值首先获取每周每天的geatest计数-使用函数
magest

select id, BOOKID, greatest(SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY) max_week from tab

        ID BOOKID   MAX_WEEK
---------- ------ ----------
         1 B200           90 
         2 B200           80 
         3 B200           80 
         4 B500           90 
         5 B500           70 
         6 B500          100 
         7 B500           60 
而不是简单地使用
max
aggregated函数

with mx as (
select id, BOOKID, greatest(SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY) max_week from tab)
select BOOKID, max(max_week) max_week 
from mx
group by BOOKID
;

BOOKID   MAX_WEEK
------ ----------
B200           90 
B500          100 
您可以将最后一个查询定义为视图,并使用ORM轻松地进行查询

create or replace view max_per_week as          
with mx as (
select id, BOOKID, greatest(SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY) max_week from tab)
select BOOKID "BookID" , max(max_week) "MaxWeek"
from mx
group by BOOKID
;


var largestNumber = context.max_per_week.Where(s => s.BookID == "B200")
                       .Select(s => new int[] { s.MaxWeek})

使用方法语法的解决方案

因此,您有一系列
书籍
,其中每本
书籍
都有一个
Id
、一个
图书Id
,以及一周中大部分天数的数字(copiessHoldCount?)

从该表中,您要从每一本
图书中提取
图书ID
和最大的
拷贝数。您可能只希望从具有给定
图书ID的
图书中获得结果

int bookId = ...
var result = Books
    .Where(book => book.BookId == bookId)
    .Select(book => new
    {
        BookId = bookId,
        MaxCopiesSole = new int[]
        {
             book.Monday, book.Tuesday, book.Wednesday, book.Thursday, book.Friday,
        }
        .Max(),
    });
换句话说:从
书籍
的顺序中,仅保留
图书ID
等于
图书ID
书籍
。从剩余的每一本
Book
创建一个新对象,该对象具有属性
BookId
和整数数组
Book的最大值。星期一
Book。星期二
,…

请尝试此代码
//创建类

 public class Book
 {
        public string Id { get; set; }
        public string BookID { get; set; }
        public int Sunday { get; set; }
        public int Monday { get; set; }
        public int Tuesday { get; set; }
        public int Wednesday { get; set; }
        public int Thursday { get; set; }
        public int Friday { get; set; }
  }

         var result = (from item in itemList
                      group item by item.BookID into groupData
                      select new
                      {
                          BookID = groupData.Key,
                          MaxNo = (from sub in groupData
                                   select new int[]
                                   {
                                       sub.Sunday,
                                       sub.Monday,
                                       sub.Tuesday,
                                       sub.Wednesday,
                                       sub.Thursday,
                                       sub.Friday
                                   }).ToList()
                      }).ToList();

       //Get Max Element
       var finalResult= (from item in result
                        select new
                        {
                            item.BookID,
                            No = (from i in item.MaxNo
                                  from ii in i
                                  orderby ii descending
                                  select ii).FirstOrDefault()


                        });

这仅仅是一个提示,为了更好地规范化表的字段(ID、BOOKID、DAY、Value)future@cyan我无法更改表,因为表的数据插入是通过bot进行的。所以我无法更改它没有名为
Saturday
?@BobJarvis良好观察-商店今天关门;)我在美国一家大型零售商工作。我相信如果可能的话,我们的商店将每周开放九天。OP需要LINQ解决方案。@BobJarvis这是我如何使用Oracle视图在LINQ中解决它的。保存不错…:-)可能值得一提的是,列必须是
非NULL
(或者使用
nvl
/
coalesce
表达式),因为任何NULL值都将给出NULL
grest()
。(在这种情况下,我猜商店将记录零销售额,并且从不为空,因此可能不是问题。)