如果你不關心看到有0計數tblRequests您可以使用此查詢的結果:如果你確實需要這些結果,你可以輕鬆地將一個表到內存
tblSerials
.Join(
tblRequests,
x => x.SerialGUID.ToLower(),
x => x.SerialGUID.ToLower(),
(o,i) => new { Serial = o, Request = i }
).GroupBy(x => x.Serial)
.Select(x => new {
SerialGUID = x.Key.SerialGUID,
CreateDate = x.Key.CreateDate,
NumberOfAllRequests = x.Select(y => y.Request.RequestGUID).Count(),
NumberOfAllRequestsDistinctByMachine = x.Select(y => y.Request.MachineCode).Distinct().Count()
}).OrderByDescending(x => x.CreateDate);
所以你可以使用一個多行lambda表達式:
tblSerials
.ToList().Select(x => {
var requests = tblRequests.Where(y => y.SerialGUID.ToLower().Equals(x.SerialGUID.ToLower()));
return new {
SerialGUID = x.SerialGUID,
CreateDate = x.CreateDate,
NumberOfAllRequests = requests.Count(),
NumberOfAllRequestsDistinctByMachine = requests.Select(y => y.MachineCode).Distinct().Count()
};
}).OrderByDescending(x => x.CreateDate);
或者,如果tblSerials太大,你可以使用一個外部聯接:
(from s in tblSerials
from r in tblRequests
.Where(x => x.SerialGUID.ToLower().Equals(s.SerialGUID.ToLower()))
.DefaultIfEmpty()
select new { Serial = s, Request = r })
.GroupBy(x => x.Serial)
.Select(x => new {
SerialGUID = x.Key.SerialGUID,
CreateDate = x.Key.CreateDate,
NumberOfAllRequests = x.Any(y => y.Request != null) ? x.Select(y => y.Request.RequestGUID).Count() : 0,
NumberOfAllRequestsDistinctByMachine = x.Any(y => y.Request != null) ? x.Select(y => y.Request.MachineCode).Distinct().Count() : 0
}).OrderByDescending(x => x.CreateDate);
注意:我實際上沒有任何性能比較,也不能保證其中的任何一個都比您的速度更快,它們只是建議。
(如果你有linqpad安裝,你可以比較一下所有這些查詢,並在下面的腳本中一些虛擬數據自己的結果:
var tblSerials = new [] {
new { CreateDate = DateTime.Today.AddDays(-2), SerialGUID = "foo" },
new { CreateDate = DateTime.Today.AddDays(-3), SerialGUID = "bar" },
new { CreateDate = DateTime.Today.AddDays(-2), SerialGUID = "foobar" },
new { CreateDate = DateTime.Today.AddDays(-1), SerialGUID = "foo" }
};
var tblRequests = new [] {
new { SerialGUID = "foo", RequestGUID = "hi", MachineCode = "1" },
new { SerialGUID = "bar", RequestGUID = "yo", MachineCode = "2" },
new { SerialGUID = "foo", RequestGUID = "hello", MachineCode = "1" },
new { SerialGUID = "baz", RequestGUID = "yeah", MachineCode = "3" }
};
tblSerials
.Join(
tblRequests,
x => x.SerialGUID.ToLower(),
x => x.SerialGUID.ToLower(),
(o,i) => new { Serial = o, Request = i }
).GroupBy(x => x.Serial)
.Select(x => new {
SerialGUID = x.Key.SerialGUID,
CreateDate = x.Key.CreateDate,
NumberOfAllRequests = x.Select(y => y.Request.RequestGUID).Count(),
NumberOfAllRequestsDistinctByMachine = x.Select(y => y.Request.MachineCode).Distinct().Count()
}).OrderByDescending(x => x.CreateDate).Dump();
(from s in tblSerials
from r in tblRequests
.Where(x => x.SerialGUID.ToLower().Equals(s.SerialGUID.ToLower()))
.DefaultIfEmpty()
select new { Serial = s, Request = r })
.GroupBy(x => x.Serial)
.Select(x => new {
SerialGUID = x.Key.SerialGUID,
CreateDate = x.Key.CreateDate,
NumberOfAllRequests = x.Any(y => y.Request != null) ? x.Select(y => y.Request.RequestGUID).Count() : 0,
NumberOfAllRequestsDistinctByMachine = x.Any(y => y.Request != null) ? x.Select(y => y.Request.MachineCode).Distinct().Count() : 0
}).OrderByDescending(x => x.CreateDate).Dump();
tblSerials
.ToList().Select(x => {
var requests = tblRequests.Where(y => y.SerialGUID.ToLower().Equals(x.SerialGUID.ToLower()));
return new {
SerialGUID = x.SerialGUID,
CreateDate = x.CreateDate,
NumberOfAllRequests = requests.Count(),
NumberOfAllRequestsDistinctByMachine = requests.Select(y => y.MachineCode).Distinct().Count()
};
}).OrderByDescending(x => x.CreateDate).Dump();
var list = from s in tblSerials
orderby s.CreateDate descending
select new
{
SerialGUID = s.SerialGUID,
CreateDate = s.CreateDate,
NumberOfAllRequests =
(from request in tblRequests
where request.SerialGUID.ToLower().Equals(s.SerialGUID.ToLower())
select request.RequestGUID).Count(),
NumberOfAllRequestsDistinctByMachine =
(from request in tblRequests
where request.SerialGUID.ToLower().Equals(s.SerialGUID.ToLower())
select request.MachineCode).Distinct().Count(),
};
list.Dump();
這些表通過ADO.NET或SQL表的內存表嗎? – 2010-10-31 21:29:40
它們是SQL表。是否可以使用存儲過程來處理它? – Babak 2010-11-01 04:47:06