Nasıl içeriğini yüklemeden EntityFramework içinde satır SAYISI için?
Nasıl belirlemek için çalışıyorumsaybir tablo EntityFramework kullanarak eşleşen satırları.
Sorun her satır veri birçok megabayt (İkili alan) olabilir. Tabii ki SQL şöyle olacaktır:
SELECT COUNT(*) FROM [MyTable] WHERE [fkID] = '1';
Tüm satırları ve yük olabilirsonrakont'la
var owner = context.MyContainer.Where(t => t.ID == '1');
owner.MyTable.Load();
var count = owner.MyTable.Count();
Ama fena halde yetersiz. Daha basit bir yolu var mı?
< / ^ hr .
EDİT: Teşekkürler herkese. Profil çalıştırmak için ben de özel bir şekilde bağlı DB geçtim; ama bunu beklemiyordum fikri olan yardımcı olur.
Ve benim gerçek verileri kullanacağım biraz daha derinKamyonlartaşımaPaletlerDurumdaÖğeleri-- ve ben istemiyorumKamyonsürece orada bırakmak en az birMaddeiçinde.
Benim girişimleri aşağıda belirtilmiştir. Anlamadığım kısım CASE_2 asla DB server (MSSQL) erişim.
var truck = context.Truck.FirstOrDefault(t => (t.ID == truckID));
if (truck == null)
return "Invalid Truck ID: " truckID;
var dlist = from t in ve.Truck
where t.ID == truckID
select t.Driver;
if (dlist.Count() == 0)
return "No Driver for this Truck";
var plist = from t in ve.Truck where t.ID == truckID
from r in t.Pallet select r;
if (plist.Count() == 0)
return "No Pallets are in this Truck";
#if CASE_1
/// This works fine (using 'plist'):
var list1 = from r in plist
from c in r.Case
from i in c.Item
select i;
if (list1.Count() == 0)
return "No Items are in the Truck";
#endif
#if CASE_2
/// This never executes any SQL on the server.
var list2 = from r in truck.Pallet
from c in r.Case
from i in c.Item
select i;
bool ok = (list.Count() > 0);
if (!ok)
return "No Items are in the Truck";
#endif
#if CASE_3
/// Forced loading also works, as stated in the OP...
bool ok = false;
foreach (var pallet in truck.Pallet) {
pallet.Case.Load();
foreach (var kase in pallet.Case) {
kase.Item.Load();
var item = kase.Item.FirstOrDefault();
if (item != null) {
ok = true;
break;
}
}
if (ok) break;
}
if (!ok)
return "No Items are in the Truck";
#endif
Ve SQL CASE_1 sonucunda taşınıyorsp_executesqlama:
SELECT [Project1].[C1] AS [C1]
FROM ( SELECT cast(1 as bit) AS X ) AS [SingleRowTable1]
LEFT OUTER JOIN (SELECT
[GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(cast(1 as bit)) AS [A1]
FROM [dbo].[PalletTruckMap] AS [Extent1]
INNER JOIN [dbo].[PalletCaseMap] AS [Extent2] ON [Extent1].[PalletID] = [Extent2].[PalletID]
INNER JOIN [dbo].[Item] AS [Extent3] ON [Extent2].[CaseID] = [Extent3].[CaseID]
WHERE [Extent1].[TruckID] = '....'
) AS [GroupBy1] ) AS [Project1] ON 1 = 1
[Gerçekten hiç Kamyon Sürücüleri, Paletler, Olgu ya da Öğeleri; gördüğünüz gibi gelen SQL Kamyon-Palet ve Palet Durum ilişkiler çok-çok -- gerçi sanmıyorum bu konularda. Benim gerçek nesneleri betimlemek için soyut ve zor olan, isimleri değiştirdim.]
CEVAP
Sorgu sözdizimi:
var count = (from o in context.MyContainer
where o.ID == '1'
from t in o.MyTable
select t).Count();
Yöntem sözdizimi:
var count = context.MyContainer
.Where(o => o.ID == '1')
.SelectMany(o => o.MyTable)
.Count()
Her ikisi de aynı SQL sorgu oluşturmak.
Nasıl/NVARCHAR dize eklemek bir SQL Se...
Nasıl bir DİV içinde loooooong bir kel...
Nasıl İsim tüm tablolar için satır say...
Nasıl satırın sonuna ve vuruş sayısı d...
Nasıl İzdiham içinde bir satır içi kod...