Aracılığıyla paylaş


Sorgu deyimi temelleri (C# Programlama Kılavuzu)

Bir sorgu nedir ve ne işe yarıyor?

A sorgu döndürülen verileri hangi verilerin belirli veri kaynağı (veya kaynakları) almak ve hangi Şekil ve kuruluş olmalıdır tanımlayan bir dizi yönergedir.Sorgu sonuçları, ürettiği farklıdır.

Genellikle, kaynak veriler, mantıksal olarak aynı türdeki öğeleri bir dizi düzenlenmiştir.Bir sql veritabanı tablosuna bir satır dizisini içerir.Benzer şekilde, bir ADO.NETDataTable içeren bir dizi DataRow nesneler. Bir xml dosyasında var. xml öğelerinin "sıra" (bunlar hiyerarşik bir ağaç yapısında düzenlenir ancak)Bellek içi koleksiyon nesnelerinin bir dizisini içerir.

Bir uygulamanın görüş açısından belirli türünü ve yapısını özgün kaynak verilerinin değil önemli.Uygulama her zaman kaynak veri olarak gördüğü bir IEnumerable<T> veya IQueryable<T> koleksiyonu.De LINQ to XML, kaynak verileri görünür olarak yapılan bir IEnumerable<XElement>.In LINQ to DataSet, it is an IEnumerable<DataRow>.De LINQ to SQL, bunun bir IEnumerable veya IQueryable ne olursa olsun özel nesnelerin sql tablosundaki verileri temsil etmek için tanımladığınız.

Bu kaynak sırası verildiğinde, bir sorgu işlemlerden birini yapabilirsiniz:

  • Tek tek öğeleri değiştirmeden yeni bir sıra oluşturmak için öğeleri kümesini almak.Sorgu sonra sıralamak veya aşağıdaki örnekte gösterildiği gibi çeşitli yollarla döndürülen sıra grubu (varsayalım scores olan bir int[]):

    IEnumerable<int> highScoresQuery =
        from score in scores
        where score > 80
        orderby score descending
        select score;
    
  • Önceki örnekte olduğu gibi öğelerin sırasını alabilir, ancak bunları yeni bir nesne türüne dönüştürebilir.Örneğin, bir sorgu yalnızca soyadları veri kaynağındaki belirli müşteri kayıtlarını almak.Veya tam kayıt almak ve hatta ya da başka bir bellek içi nesne türü oluşturmak için kullanmak sonuç sırası oluşturuluyor önce xml verileri.Gelen bir dönüşüm aşağıdaki örnekte gösterilmektedir bir int için bir string.Yeni Not highScoresQuery.

    IEnumerable<string> highScoresQuery2 =
        from score in scores
        where score > 80
        orderby score descending
        select String.Format("The score is {0}", score);
    
  • Kaynak verileri hakkında bir singleton değer gibi Al:

    • Belirli bir koşula uyan öğelerin sayısı.

    • En yüksek veya en düşük değere sahip olan öğe.

    • Bir koşul veya belirtilen bir dizi belirli değerleri toplamı eşleşen ilk öğe.Örneğin, aşağıdaki sorgu puan sayısı 80'den daha büyük verir scores tamsayı dizisi:

    int highScoreCount =
        (from score in scores
         where score > 80
         select score)
         .Count();
    

    Önceki örnekte, sorgu ifadesi çağrısından önce etrafındaki parantezlerle kullanımına dikkat edin Count yöntemi.Siz de bu somut sonucu depolamak için yeni bir değişkeni kullanarak ifade edebilirsiniz.Bu teknik daha okunabilir çünkü sorguyu depolamak değişken saklayan bir sonuç sorgudan ayrı tutar.

    IEnumerable<int> highScoresQuery3 =
        from score in scores
        where score > 80
        select score;
    
    int scoreCount = highScoresQuery3.Count();
    

Önceki örnekte çağrısında sorgusu yürütüldüğünde Count, çünkü Count tarafından döndürülen öğe sayısını belirlemek için sonuçları yineleme yapmak gerekir highScoresQuery.

Bir sorgu ifadesinde nedir?

A sorgu ifadesi sorgusu sözdiziminde ifade bir sorgu ise.Bir sorgu ifadesinde birinci dil yapısıdır.Diğer ifade gibi olduğundan ve geçerli bir C# ifade herhangi bir içerikte kullanılabilir.Bir sorgu ifadesinde bildirimsel sözdizimi sql veya XQuery benzer yazılmış tümceleri kümesi oluşur.Her yan sırayla bir veya daha fazla C# ifadeleri içerir ve bu ifadeler kendilerini bir sorgu ifadesinde veya olabilir sorgu ifadesi içeriyor.

Bir sorgu ifadesinde başlaması gerekir bir dan yan tümcesi ve ile sona ermelidir bir seçin veya Grup yan tümcesi.İlk arasında from yan tümcesi ve son select veya group yan tümcesi, bir veya daha fazla isteğe bağlı bu yan tümceleri içeren: burada, orderby, birleştirme, izin ve hatta ek dan yan tümceleri.De kullanabilirsiniz içine sonucu etkinleştirmek için anahtar sözcüğü bir join veya group yan ek sorgu yan tümceleri aynı sorgu ifadesinde kaynağı olarak hizmet verecek.

Bb384065.collapse_all(tr-tr,VS.110).gifSorgu değişkeni

De LINQ, depolar herhangi bir değişken sorgu değişkeni olan bir sorgu yerine sonuçları sorgu. Özellikle de, sorgu değişkeni her zaman onu üzerinden de iterated zaman, öğelerin sırasını oluşturacak bir sýralanabilir türüdür bir foreach deyimi veya doğrudan çağrısı, IEnumerator.MoveNext yöntemi.

Aşağıdaki kod örneği, bir veri kaynağı ile basit sorgu ifadesi, bir filtre yan tümcesi, bir sıralama yan tümcesi ve kaynak öğelerden herhangi bir dönüşüm göstermektedir.select Yan tümcesi sorguyu sonlandırır.

static void Main()
{
    // Data source.
    int[] scores = { 90, 71, 82, 93, 75, 82 };

    // Query Expression.
    IEnumerable<int> scoreQuery = //query variable
        from score in scores //required
        where score > 80 // optional
        orderby score descending // optional
        select score; //must end with select or group

    // Execute the query to produce the results
    foreach (int testScore in scoreQuery)
    {
        Console.WriteLine(testScore);
    }                  
}
// Outputs: 93 90 82 82      

Önceki örnekte, scoreQuery olan bir sorgu değişkenine , bazen denir olarak tam bir sorgu.Sorgu değişkeni içinde üretilen hiçbir gerçek sonuç veri depolayan foreach döngü.Ve ne zaman foreach deyimini yürütür, sorgu sonuçları sorgu değişkeni dönmedi scoreQuery.Bunun yerine değişkeni verilir testScore.scoreQuery Değişkeni bir saniye içinde iterated foreach döngü.Ne onu ne de veri kaynağında değiştirilmiş olarak aynı sonuçları oluşturur.

Sorgu değişken ifade edilen bir sorguyu sorgu sözdizimi veya yöntemi sözdiziminin veya ikisinin bir birleşimi depolayabilir.Aşağıdaki örneklerde, her ikisi de queryMajorCities ve queryMajorCities2 sorgu değişkenleri:

//Query syntax
IEnumerable<City> queryMajorCities =
    from city in cities
    where city.Population > 100000
    select city;


// Method-based syntax
IEnumerable<City> queryMajorCities2 = cities.Where(c => c.Population > 100000);

Diğer taraftan, aşağıdaki iki sorgu değişkenlerinin her üzerinden bile olmayan değişkenleri içeren bir sorgu başlatılan örnekler.Sonuçları sakladığı bunlar sorgu değişkenlerinin değil:

int highestScore =
    (from score in scores
     select score)
    .Max();

// or split the expression
IEnumerable<int> scoreQuery =
    from score in scores
    select score;

int highScore = scoreQuery.Max();

List<City> largeCitiesList =
    (from country in countries
     from city in country.Cities
     where city.Population > 10000
     select city)
       .ToList();

// or split the expression
IEnumerable<City> largeCitiesQuery =
    from country in countries
    from city in country.Cities
    where city.Population > 10000
    select city;

List<City> largeCitiesList2 = largeCitiesQuery.ToList();

[!NOT]

De LINQ belgeler, bir sorguyu depolamak değişkenleri adlarını bir parçası olarak "query" sözcüğü vardır.Gerçek bir sonucu depolamak değişken adlarında "query" yoktur.

Hızlı sorgular için farklı yollar hakkında daha fazla bilgi için bkz: LINQ'te Sorgu Sözdizimi ve Yöntem Sözdizimi (C#).

Bb384065.collapse_all(tr-tr,VS.110).gifAçık ve kapalı sorgu değişkeni yazarak

Bu belgeleri, sorgu değişkeni açık tür sorgu değişken türü ilişkisi göstermek için genellikle sağlar ve yan tümcesi seçin.Bununla birlikte de kullanılabilir var (veya yerel bir değişken) bir sorgu değişken türü derleme zamanında gerçekleştirip derleyiciye için anahtar sözcük.Örneğin, bu konuda daha önce gösterilen sorgu örneği de örtülü yazarak kullanarak ifade edilebilir:

// Use of var is optional here and in all queries.
// queryCities is an IEnumerable<City> just as 
// when it is explicitly typed.
var queryCities =
    from city in cities
    where city.Population > 100000
    select city;

Daha fazla bilgi için, bkz. Yerel değişkenler örtülü olarak yazılı (c Programlama Kılavuzu #) ve Tür ilişkileri LINQ sorgu işlemlerinde (C#).

Bb384065.collapse_all(tr-tr,VS.110).gifBir sorgu ifadesinde başlatma

Bir sorgu ifadesinde başlaması gerekir bir from yan tümcesi.Bu veri kaynağı ile birlikte aralık değişkeni belirtir.Kaynak sırası yapı olarak aralık değişkeni her öğeyi bir öncekinin kaynak sıra temsil eder.Aralık değişkeni kesinlikle veri kaynağındaki öğe türüne göre yazılıyor.Aşağıdaki örnekte, çünkü countries bir dizisi olan Country nesneler, aralık değişkeni olarak yazılan de Country.Aralık değişkeni kesinlikle yazıldığı için kullanılabilir herhangi bir tür üyeleri erişmek için nokta operatörünü kullanabilirsiniz.

IEnumerable<Country> countryAreaQuery =
    from country in countries
    where country.Area > 500000 //sq km
    select country;

Sorgu veya noktalı virgül ile birlikte çıkılıncaya kadar aralık değişken sınırların bir devam yan tümcesi.

Bir sorgu ifadesinde çok içerebilir from yan tümceleri.Ek kullanım from yan tümceleri her öğe kaynak sıradaki kendisi bir araya gelmesinden oluşur veya bir koleksiyonu içerir.Örneğin, topluluğu olduğunu varsayalım Country nesneleri, her biri bir topluluğu içeren City adlı nesneleri Cities.Sorguya City nesneleri her Country, iki kullanmak from aşağıda gösterildiği gibi yan tümceleri:

IEnumerable<City> cityQuery =
    from country in countries
    from city in country.Cities
    where city.Population > 10000
    select city;

Daha fazla bilgi için bkz. from yan tümcesi (C# Reference).

Bb384065.collapse_all(tr-tr,VS.110).gifBir sorgu ifadesinde bitiş

Bir sorgu ifadesinde ya da ile bitmelidir bir select yan tümcesinde veya bir group yan tümcesi.

Bb384065.collapse_all(tr-tr,VS.110).gifGrup yan tümcesi

Use group yan grupları bir dizi üretmek için düzenlenmiş, belirttiğiniz bir anahtar.Anahtar, herhangi bir veri türü olabilir.Örneğin, aşağıdaki sorgu veya daha fazlasını içeren bir dizi gruplar oluşturur Country nesneleri ve anahtarı olan bir char değeri.

var queryCountryGroups =
    from country in countries
    group country by country.Name[0];

Gruplandırma hakkında daha fazla bilgi için bkz: GROUP BY (C# Reference).

Bb384065.collapse_all(tr-tr,VS.110).gifYan seçin

Use select her türlü sıraları üretmek için yan tümcesi.Basit bir select yan tümcesi yalnızca veri kaynağında bulunan nesneleri nesne aynı türde bir dizi üretir.Bu örnekte, veri kaynağını içeren Country nesneler.orderby Yan tümcesi yalnızca yeni bir düzeni içinde öğeleri sıralar ve select yan tümcesi yeniden düzenlenen bir dizi üreten Country nesneler.

IEnumerable<Country> sortedQuery =
    from country in countries
    orderby country.Area
    select country;

select Yan tümcesi, yeni türleri kısımlarının kaynak verileri dönüştürmek için kullanılabilir.Bu dönüşüm aynı zamanda adlı bir projeksiyon.Aşağıdaki örnekte, select yan projeleri özgün öğe bulunan alanların yalnızca bir alt kümesini içeren bir dizi anonim türleri.Yeni nesneler, nesne Başlatıcı'yı kullanarak olarak atanacağını unutmayın.

// Here var is required because the query
// produces an anonymous type.
var queryNameAndPop =
    from country in countries
    select new { Name = country.Name, Pop = country.Population };

Tüm yolları hakkında daha fazla bilgi için bir select yan tümcesi, kaynak verileri dönüştürmek için bkz: kullanılabilir yan tümcesi (C# Reference) seçin.

Bb384065.collapse_all(tr-tr,VS.110).gif"İçine" ile continuations

Kullanabileceğiniz into anahtar sözcük bulunan bir select veya group bir sorgu saklayan geçici bir tanımlayıcı oluşturmak üzere yan tümcesi.Bunu Gruplamadan sonra sorgu ek sorgu işlemleri gerçekleştirmek veya operasyon seçin.Aşağıdaki örnekte, countries nüfus 10 milyon aralıklara göre gruplandırılır.Sonra bu grupları oluşturulmuş, ek yan tümceleri filtre bazı gruplar dışında ve sonra sıralama artan grupları sipariş.Bu ek işlemleri gerçekleştirmek için devamı temsil ettiği countryGroup gereklidir.

// percentileQuery is an IEnumerable<IGrouping<int, Country>>
var percentileQuery =
    from country in countries
    let percentile = (int) country.Population / 10000000
    group country by percentile into countryGroup
    where countryGroup.Key >= 20
    orderby countryGroup.Key
    select countryGroup;

// grouping is an IGrouping<int, Country>
foreach (var grouping in percentileQuery)
{
    Console.WriteLine(grouping.Key);
    foreach (var country in grouping)
        Console.WriteLine(country.Name + ":" + country.Population);
}

Daha fazla bilgi için bkz. (C# Başvurusu).

Bb384065.collapse_all(tr-tr,VS.110).gifSüzme, sıralama ve birleştirme

Başlangıç arasında from yan tümcesi ve bitiş select veya group yan tümcesi, diğer tüm koşullar (where, join, orderby, from, let) isteğe bağlıdır.İsteğe bağlı yan tümceleri birini sıfır veya birden çok kez sorgu gövdesi içinde kullanılabilir.

Bb384065.collapse_all(tr-tr,VS.110).gifWHERE yan tümcesi

Use where öğeler kaynak veriden filtre yan dayalı bir veya daha fazla doðrulama deyimleri.where Yan tümcesi aşağıdaki örnekte iki koşul vardır.

IEnumerable<City> queryCityPop =
    from city in cities
    where city.Population < 200000 && city.Population > 100000
    select city;

Daha fazla bilgi için bkz. WHERE yan tümcesi (C# Reference).

Bb384065.collapse_all(tr-tr,VS.110).gifOrderBy yan tümcesi

Use orderby sonuçları artan veya azalan düzende sıralamak için yan tümcesi.İkincil sıralama düzenleri de belirtebilirsiniz.Aşağıdaki örnek bir birincil sıralama gerçekleştirir country kullanarak nesneleri Area özelliği.Daha sonra ikincil sıralama kullanarak gerçekleştirdiği Population özelliği.

IEnumerable<Country> querySortedCountries =
    from country in countries
    orderby country.Area, country.Population descending
    select country;

ascending Anahtar sözcüğü isteğe bağlıdır; hiçbir sipariş belirtilmezse varsayılan sıralama düzeni kullanılır.Daha fazla bilgi için bkz. OrderBy yan tümcesi (C# Reference).

Bb384065.collapse_all(tr-tr,VS.110).gifjoin yan tümcesi

Use join her öğesinde belirtilen anahtarları arasında bir eşitlik karşılaştırma temel yan ilişkilendirmek ve/veya öğeleri başka bir veri kaynağından alınan bir veri kaynağından alınan öğeleri birleştirin.De LINQ, birleştirme işlemlerini öğelerinin farklı olan nesneler dizisi üzerinde gerçekleştirilir.İki sıraları katıldıktan sonra kullanmalısınız bir select veya group çıktı sırada depolamak için öðeyi belirtmek için ifade.Anonim bir tür, çıkış sırası için yeni bir tür içine her dizi ilişkili öğe özellikleri birleştirmek için de kullanabilirsiniz.Aşağıdaki örnek associates prod whose nesneleri Category özellikle eşleşiyor kategorilerde birini categories dize dizisi.Ürünler, Category herhangi bir dizesinde eşleşmeyen categories filtrelenir.select Deyimi proje özelliklerini her ikisini de alınır yeni bir tür cat ve prod.

var categoryQuery =
    from cat in categories
    join prod in products on cat equals prod.Category
    select new { Category = cat, Name = prod.Name };

Sonuçları depolayarak grubu birleştirme gerçekleştirebilir join işlemi kullanarak geçici bir değişken içine anahtar sözcüğü.Daha fazla bilgi için bkz. JOIN yan tümcesi (C# Reference).

Bb384065.collapse_all(tr-tr,VS.110).gifyan tümcesi izin

Use let bir yöntem çağrısı gibi bir ifadenin sonucunu yeni bir aralık değişkende saklamak için yan tümcesi.Aşağıdaki örnekte, aralık değişkeni firstName ilk öğesi tarafından döndürülen dize dizisi saklar Split.

string[] names = { "Svetlana Omelchenko", "Claire O'Donnell", "Sven Mortensen", "Cesar Garcia" };
IEnumerable<string> queryFirstNames =
    from name in names
    let firstName = name.Split(new char[] { ' ' })[0]
    select firstName;

foreach (string s in queryFirstNames)
    Console.Write(s + " ");
//Output: Svetlana Claire Sven Cesar

Daha fazla bilgi için bkz. yan tümcesi (C# Reference) olanak sağlar.

Bb384065.collapse_all(tr-tr,VS.110).gifBir sorgu ifadesinde alt sorgular

Bir sorgu yan tümcesinde kendisini bazen olarak verilen bir sorgu ifadesinde içerebilir bir alt sorgu.Her sorgunun kendi ile başlayan from mutlaka aynı veri kaynağına ilk göstermiyor yan from yan tümcesi.Örneğin, aşağıdaki sorgu bir gruplandırma işlemi sonuçlarını almak için select deyiminde kullanılan bir sorgu ifadesinde gösterir.

var queryGroupMax =
    from student in students
    group student by student.GradeLevel into studentGroup
    select new
    {
        Level = studentGroup.Key,
        HighestScore =
            (from student2 in studentGroup
             select student2.Scores.Average())
             .Max()
    };

Daha fazla bilgi için bkz. Nasıl yapılır: bir alt sorgu bir gruplandırma işlemi (C# Programlama Kılavuzu) gerçekleştirmek.

Ayrıca bkz.

Kavramlar

C# Programlama Kılavuzu

LINQ sorgu ifadelerini (C# Programlama Kılavuzu)

Standart sorgu işleçler genel bakış

Diğer Kaynaklar

LINQ (dil ile bütünleşik sorgu)

Sorgu anahtar sözcükler (C# Reference)