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值都将给出NULLgrest()
。(在这种情况下,我猜商店将记录零销售额,并且从不为空,因此可能不是问题。)