SORU
20 Mayıs 2009, ÇARŞAMBA


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
20 Mayıs 2009, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FUzzyBUnnyBOoties

    FUzzyBUnnyBO

    3 EKİM 2007
  • Jabari Johnson

    Jabari Johns

    18 Ocak 2008
  • max2sims2

    max2sims2

    19 Kasım 2008