2

私は LINQ を初めて使用します。質問があった場合は申し訳ありません

私は2つのクラスを持っています

public class Person
{
    int ID {get;set;}
    string FirstName {get;set;}
    string LastName {get;set;}
}

public class House
{
    int ID {get;set;}
    string Address {get;set;}
    string ZipCode {get;set;}
    int PersonId {get;set;}
}

家のリストをIEnumerable Listに保存しています

IEnumerable<House> ListHouses = GetAllHouses();

GetAllHouses は、データベースから住宅のリストを返します

次のことを行うために、LINQでLamda selectを使用したい

var st = ListHouses .Select(h => new
{
    id = h.ID,
    Address= h.Address,
    Zip= h.ZipCode ,
    PersonFirstName = GetPersonByID(h.PersonId ).FirstName, 
    PersonLastname = GetPersonByID(h.PersonId ).lastname

});

GetPersonByID はPerson、指定された ID を持つ Type のオブジェクトを返します。それから私は彼の姓と名を取ります。

私の質問はこれです:

変数 (personFirstName と PersonLastName) に対して Person を 2 回取得する代わりに、1 回取得してから使用する方法はありますか。何かのようなもの

PersonForId = GetPersonByID(h.PersonId)
PersonFirstName =  PersonLastName.FirstName,
PersonLastname = PersonLastName.lastname

別のテーブルの値を結合する SQL の Join に似たものを探しています。

助けてくれてどうもありがとう

4

2 に答える 2

5

あなたは非常に近いです!コードを使用して (そして House と Person のすべてのプロパティを公開して)、LINQ Join メソッドを使用するメソッドを次に示します。

var st = GetAllHouses().Join(GetAllPersons(),
    outerKey => outerKey.PersonId,
    innerKey => innerKey.ID,
    (house, person) => new
    {
        house.ID,
        house.Address,
        house.ZipCode,
        PersonFirstName = person.FirstName,
        PersonLastname = person.LastName
    });

注: GetAllPersons() および GetAllHouses() メソッドは、IEnumerable ではなく IQueryable を返すことをお勧めします。これにより、式 (結合を含む) が作成されます。つまり、LINQ-to-SQL (またはエンティティ) は、コレクションを列挙してから結合するのではなく、JOIN を含む適切な SQL ステートメントを作成します

そのような追加情報はここにあります: Returning IEnumerable<T> vs. IQueryable<T>

于 2012-04-10T12:44:01.753 に答える
3
using System;
using System.Linq;

class Customer
{
    public int ID { get; set; }
    public string Name { get; set; }
}

class Order
{
    public int ID { get; set; }
    public string Product { get; set; }
}

class Program
{
    static void Main()
    {
    // Example customers.
    var customers = new Customer[]
    {
        new Customer{ID = 5, Name = "Sam"},
        new Customer{ID = 6, Name = "Dave"},
        new Customer{ID = 7, Name = "Julia"},
        new Customer{ID = 8, Name = "Sue"}
    };

    // Example orders.
    var orders = new Order[]
    {
        new Order{ID = 5, Product = "Book"},
        new Order{ID = 6, Product = "Game"},
        new Order{ID = 7, Product = "Computer"},
        new Order{ID = 8, Product = "Shirt"}
    };

    // Join on the ID properties.
    var query = from c in customers
            join o in orders on c.ID equals o.ID
            select new { c.Name, o.Product };

    // Display joined groups.
    foreach (var group in query)
    {
        Console.WriteLine("{0} bought {1}", group.Name, group.Product);
    }
    }
}

出力

サムは本を買った デイブはゲームを買った ジュリアはコンピューターを買った スーはシャツを買った

于 2012-04-10T12:24:04.373 に答える