C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: LINQ TO SQLでフィールド指定


(過去ログ 98 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■58652 / inTopicNo.1)  LINQ TO SQLでフィールド指定
  
□投稿者/ BOB (1回)-(2011/04/20(Wed) 16:10:39)

分類:[.NET 全般] 

2011/04/20(Wed) 16:12:05 編集(投稿者)
LINQ TO SQLでデータを取得していたのですが、
今回新たに取得するフィルードを増やすことになりました。
(WHERE句の条件は変わりません)


例えば以下のようなクエリをつかった関数があったとして
今回新たに取得するフィールドが必要になった場合は
別の関数を作るしかないのでしょうか。
(バージョン互換のため、古いIFは残したいです)

今後取得するフィールドが増えていく毎に同じような名前の
同じような関数が増えてしまってカッコ悪いなあと感じています。

このような場合みなさんはどう対処されているのか知りたいです。

(クエリを引数にするとかは不可能なのでしょうか?)

     var q =
     from a in context.Group
     where a.ID == "1"

     select new
     {
         s.ID,
         s.Name
     };


アドバイスをいただけると助かります。
よろしくお願いします。

引用返信 編集キー/
■58660 / inTopicNo.2)  Re[1]: LINQ TO SQLでフィールド指定
□投稿者/ shu (638回)-(2011/04/21(Thu) 08:20:09)
No58652 (BOB さん) に返信

提示されたものは関数内の1処理に過ぎないので
ここに新しい項目を増やしてもコンパイルさえすれば
インターフェースの不一致によるエラーは発生しないと
思うのですが、もう少し分かるよう書かれたほうがよいと思います。
引用返信 編集キー/
■58662 / inTopicNo.3)  Re[2]: LINQ TO SQLでフィールド指定
□投稿者/ BOB (2回)-(2011/04/21(Thu) 09:39:39)
No58660 (shu さん) に返信

例えば以下のようなクエリをつかった関数があったとして
今回新たに取得するフィールドが必要になった場合は
(以下の例ですと、CustomerのCityをselectしたい場合)
別の関数を作るしかないのでしょうか。
(バージョン互換のため、IDとNAMEを取得する機能は必要なんです)

今後取得するフィールドが増えていく毎に同じような名前の
同じような関数が増えてしまってカッコ悪いなあと感じています。

このような場合みなさんはどう対処されているのか知りたいです。

(クエリを引数にするとかは不可能なのでしょうか?)


internal static void GetCustomerData(string company)
{
    NorthWindDataContext context = new NorthWindDataContext()
    {
        var records =
            from c in context.Customer
            where company == c.CompanyName
            select new
            {
                ID = c.CustomerID,
                NAME = c.CompanyName
            };
    }
	foreach (var r in records)
      {
      // データ出力.
      }
}

引用返信 編集キー/
■58666 / inTopicNo.4)  Re[3]: LINQ TO SQLでフィールド指定
□投稿者/ shu (640回)-(2011/04/21(Thu) 12:49:45)
No58662 (BOB さん) に返信

> internal static void GetCustomerData(string company)
> {
> NorthWindDataContext context = new NorthWindDataContext()
> {
> var records =
> from c in context.Customer
> where company == c.CompanyName
> select new
> {
> ID = c.CustomerID,
> NAME = c.CompanyName
> };
> }
> foreach (var r in records)
> {
> // データ出力.
> }
> }

これでも1処理の中で完結していることなのでNAMEの後に項目を増やすだけでいいかと思います。

一応、IEnumerable<クラス名>の引数にしとけば関数へクエリを渡すことは可能です。
IQueryable<クラス名>で渡せる場合もあります。

引用返信 編集キー/
■58667 / inTopicNo.5)  Re[4]: LINQ TO SQLでフィールド指定
□投稿者/ BOB (3回)-(2011/04/21(Thu) 13:15:53)
No58666 (shu さん) に返信
> これでも1処理の中で完結していることなのでNAMEの後に項目を増やすだけでいいかと思います。
>
> 一応、IEnumerable<クラス名>の引数にしとけば関数へクエリを渡すことは可能です。
> IQueryable<クラス名>で渡せる場合もあります。
>

コメントありがとうございます。

質問の補足なのですが、

サーバー側のメソッドで
CustomerID、CompanyNameを取得する関数があって、(v1.0だとして)
V2.0ではCustomerID、CompanyName、Cityを取得することになった場合
(クライアントからはV1.0のメソッドもV2.0のメソッドも呼ばれるとして)

別メソッドを新規作成すれば解決できるのですが、
実はもっとスマートな方法があれば教えていただきたいなと思いました。
(今後、取得するカラムが増えるたびにこの手のメソッドが増えてしまうので)

とりあえずは別メソッドを用意して対処します。


引用返信 編集キー/
■58858 / inTopicNo.6)  Re[5]: LINQ TO SQLでフィールド指定
□投稿者/ くり太郎 (17回)-(2011/04/29(Fri) 14:46:16)
くり太郎 さんの Web サイト
No58667 (BOB さん) に返信

> サーバー側のメソッドで
> CustomerID、CompanyNameを取得する関数があって、(v1.0だとして)
> V2.0ではCustomerID、CompanyName、Cityを取得することになった場合
> (クライアントからはV1.0のメソッドもV2.0のメソッドも呼ばれるとして)
>
> 別メソッドを新規作成すれば解決できるのですが、
> 実はもっとスマートな方法があれば教えていただきたいなと思いました。
> (今後、取得するカラムが増えるたびにこの手のメソッドが増えてしまうので)

Dynamic LINQ という方法がありますが、これだとダメでしょうか?

http://blogs.bitlan.net/ito/?p=1406
Ito Blog &raquo; Blog Archive &raquo; LINQ to SQL で動的にデータを取得する
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -