9

プロジェクトでlinqコードを設計するための提案は何ですか?特に、大きくて複雑な統合言語クエリのコード設計に興味がありますか?

たとえば、巨大なlinqのものをたくさん書く必要があることを知っています。おそらく、コードの一部に重複部分がある場合とそうでない場合があり、次のことが必要です。

  1. コードを簡単にサポートできるようにします。つまり、何かを変更する必要がある場合です。-あなたは一つのことを変えています、多くはありません

  2. コードを読みやすくします。つまり、何かを見つける必要がある場合は、これを簡単に行うことができます。

あなたはあなたの例、多分あなたの練習を使うことができます。たぶん、あなたがどこでも見たいくつかのパターン-何でも。

linqとは、任意のlinq、linqからsql、linqからオブジェクト、linqからxmlなどを意味します。

Tnx

4

4 に答える 4

7

オブジェクトの拡張機能を作成できます。

メインコード;

IQuerable itemList = _coreRepository.GetSomeItems()
                .WithStates(OperationIdentity.SendToSomeWhere)
                .BetweenDates(StartDate, EndDate);

拡大;

public static IQueryable<SomeObject> BetweenDates(this IQueryable<SomeObject> query, DateTime startDate, DateTime endDate)
        {
            return from p in query
                   where p.CompletedDate >= startDate && p.CompletedDate < endDate
                   select p;
        }
于 2010-08-20T07:40:28.153 に答える
3

拡張メソッドを使用して何度も使用される大きなSelectステートメントを脇に置くのが好きです。

public static IQueryable<SomeEntityPM> SelectEntityPM(this IQueryable<SomeEntity> entities)
{
     return entities.Select(a => new SomeEntityPM { ... });
}

使用法:

 ObjectCtx.SomeEntities.SelectEntityPM();
于 2010-08-20T07:40:29.667 に答える
2

このための便利なパターンの1つは、再利用可能な述語ライブラリを作成することです。詳細については、 LINQPredicateBuilderのこのページを確認してください。

于 2010-08-20T07:43:30.940 に答える
2

私がよくすること:

1)レイアウト:常に次の行からクエリを開始します。例:これを行わないでください

var allCustomersThatDontContainUnpayedOrders = from customer in db.Customers
                                               where customer.Orders ...
                                               select customer;

しかし、これを行います:

var allCustomersThatDontContainUnpayedOrders = 
    from customer in db.Customers
    where customer.Orders ...
    select customer;

2)where可能な場合は複数の句を使用します。最初のスニペットよりも読みやすい2番目のスニペットを見つけようとしています。

var results =
    from customer in db.Customers
    where customer.Name.Contains(search) && customer.Address.City != null &&
       customer.Employee.IsSenior
    select customer;

var results =
    from customer in db.Customers
    where customer.Name.Contains(search)
    where customer.Address.City != null
    where customer.Employee.IsSenior
    select customer;

3)可能であれば、参加を防止します。joinLINQ to SQLを使用すると、理解しにくいステートメントを使用せずに、すべての親子関係に「ドット」を付けることができます。

4)多くの場合、多くのクエリが似ていることがわかります。ユーザーの権限に基づいて特定のレコードを常にフィルタリングしたい場合があります。次のメソッドでこのコードを抽出できます。

var customers = db.Customers;

customers = FilterBasedOnUserRights(customers, currentUser);

public static IQueryable<Customer> FilterBasedOnUserRights(
    IQueryable<Customers customers, User currentUser)
{
    return
        from customer in customers
        where [big complicated where clause]
        select customer;
}
于 2010-08-20T08:17:43.383 に答える