【VB.NET】LINQ友の会【C#, C♯, C#】

レス数が900を超えています。1000を超えると表示できなくなるよ。
1デフォルトの名無しさん
垢版 |
2008/02/09(土) 23:51:34
VisualStudio2008より追加された便利で強力な機能

  統合言語クエリ (LINQ : Language Integrated Query)

ちょっと使ってみると、意外と難しいし、テクニック的にも奥が深いものです。
関数型言語にしかないような機能ラムダ式(Lambda式)などはオブジェクト指向とは一味違う機能です。
DataBaseの操作にも、Xmlの操作にも、さらにもっと単純な配列なコンテナにさえ機能する
言語共通・高汎用な統合言語クエリを皆で一緒にマターリ勉強しましょう。
質問、便利なマイテクニックの発表、いろいろやっちゃってください。
2013/12/19(木) 09:57:31.91
LINQ to Entityは大して絶対的なもんじゃないだろ
独自XMLマッピングはないけど
2013/12/19(木) 10:16:46.64
見事に使われなくなった悲しい技術。
2013/12/19(木) 11:16:39.10
Entity FramworkをLinqなしで使うとなると、
Query Builderにご登場願わなくてはならないが、
正直あれはない・・・;
2013/12/19(木) 12:06:53.80
>>810
使われなくなったんじゃなくて、真相はLINQを理解できない頭の固いSEがLINQ禁止令を出しただけ
Javaも時期バージョンでStreamが入るのに何言ってんの?
2013/12/19(木) 12:07:24.58
×時期
○次期
2013/12/19(木) 13:41:08.86
そもそも汎用性のない独自マッピングとか存在価値がわからない
DB覗いてテーブルとデータ把握しないといけないのにラップする意味ないだろ
2013/12/19(木) 15:47:37.88
クエリ構文が要らんというなら分かる
2013/12/19(木) 17:54:32.34
拡張メソッドがあればクエリ構文は不要。

そう思っていた時期が私にもありました。
2013/12/19(木) 18:10:53.57
クエリ構文はキモい

拡張メソッドは正義
2013/12/19(木) 20:29:32.26
じゃあお前にクエリ構文で書かれたjoinを拡張メソッドに書き直す仕事をやろう
2013/12/20(金) 15:34:34.73
クエリ構文もメソッド構文もキモくないけど
混ぜ書きがキモい
2013/12/24(火) 19:27:31.94
しかしクエリ構文で何故selectを最初にしなかったんだろ
SQLと一緒にすればいいのに
2013/12/24(火) 19:29:25.67
インテリセンスが利かないから
822デフォルトの名無しさん
垢版 |
2013/12/27(金) 06:53:18.24
代々木

栃木

横浜湖

岐阜

兵庫
2013/12/31(火) 20:57:12.59
もしかしてTableAdapterって製品版誘導のためのブラックボックスですか?
2014/01/05(日) 07:29:28.09
にほんごでOK
2014/01/07(火) 00:27:37.75
Entity FrameworkをSQLiteで使い始めたんだが、
カラムが文字列とか数値とか5個くらいのテーブルにテスト用として1行入れたデータを1行取り出す処理に1.4秒もかかるんだが・・・
どうなってるんだ?
Table per hierarchyの継承を使っているせいか?

var query = context.Superclass.OfType<Subclass>().Where( obj => obj.Id == 1);

foreach (Superclass obj in query)
{
Console.WriteLine(obj.Id);
}

Idプロパティはエンティティキー。
実行しなくてもデータがあれば、明らかに結果は「1」なのだが、これで1.4秒もかかってしまう。
ちなみにSubclassの判定には、あるBLOBのカラムがNULLでなければSubclassの行。

もちろん、
SELECT * FROM Superclasses WHERE Id = 1;
というSQLをsqlite3.exeというコマンドラインインターフェイスで投げると0.1秒もかからない。
実際に行いたい処理はこんなもんじゃなくて別のプロパティで検索してリレーションをたどるのだが、どれだけ条件を削っても遅くて・・・
826825
垢版 |
2014/01/07(火) 01:20:00.16
データベースファイルを作り直したところ、35ミリ秒程度に改善しました。
大変お騒がせしました。
2014/01/08(水) 08:49:14.97
EnumerableRowCollection<DataRow> query =
from row in contacts.AsEnumerable()
where IsContainArr(row[0].ToString(), fig)
select row;

bool IsContainArr(string s, string[] arr)
{
foreach (var a in arr)
{
if (!s.Contains(a)) return false;
}
return true;
}

って、メソッドで用意されてないんかな
2014/01/08(水) 22:37:35.19
Any All
2014/01/12(日) 08:32:51.26
AND 演算子を LINQ サブクエリに結果が表示されますなし
http://ja.softuses.com/98912
2014/01/13(月) 21:22:32.83
ORとか多次元配列は拡張メソッドを使うしかないな
2014/02/25(火) 07:18:07.32
AndとOrって全部AndAlsoとOrElseに書き換えて大丈夫なの?
あとWhereで「A == B」と「A Equals B」の違いってなんなの?
2014/02/25(火) 21:01:27.85
大丈夫じゃない可能性はあるが
VBのAndとOrはビット演算以外ではもはや不要
置換してしまえ
2014/02/25(火) 21:22:16.17
値型の配列はIEnumerable<object>にキャストできない。
かといってIEnumerableだとLINQに流し込めなくてめんどくさい…。

どうしようかと悩んだ末にこうなった。

var obj = new[] { 1, 2, 3 };
var q = from object x in (IEnumerable)obj select x.ToString();

型指定してやればいけるんだね。
2014/02/25(火) 21:27:32.63
>>831
ここはLINQスレなんでできればVB.NETのスレで聞いたほうが確実な回答を得られると思うよ。

And/Orのあとに副作用(グローバルな変数やDBの書き換えetc)のある関数の呼び出しをしていないのなら全置換しちまえ
Equalsの件はdobonなサイトで調べるがよろしいかと。
http://dobon.net/vb/dotnet/beginner/equality.html
2014/02/25(火) 21:44:04.83
>>833
obj.Cast<object>()とかでいいんじゃね?
836831
垢版 |
2014/02/25(火) 22:37:27.65
>>832
ありがとうございます。ほぼ大丈夫そうですね。

>>834
すみません、こういうのはVBの範疇なのですね。
こんがらがってしまっていました…
お教え頂いたサイトも熟読してみます。
どうもありがとうございました。
2014/02/26(水) 03:55:31.47
>>835
IEnumerableにCastあったのか。
無いと思い込んでたよ…。

クエリ式でキャストできるのも知らなかったから、全くの無駄足ではなかったけど凹む。
var obj = (object)new[] { 1, 2, 3 };
var q = from int x in (IEnumerable)obj select x.ToString();
2014/02/26(水) 11:22:47.19
LINQ to EntityだとOrとOrElseとかは等価なんだろうな
2014/02/27(木) 21:15:09.47
■データセットAの内容
c1 c2 c3 c4
01 01 01 AA
01 01 02 BB
01 02 02 CC
02 02 02 DD

■データセットBの内容
c1 c2 c3 c4
01 01 02 sss
01 02 02 ttt

上のようなデータセットA・Bを列c1・c2・c3で結びつけた場合に
データセットAのみに存在するデータを取得するには
どのようなLINQを記述すればよいのでしょうか?
つまり下の結果を得たいのですが、お手上げ状態です…

■結果
c1 c2 c3 c4
01 01 01 AA
02 02 02 DD
840デフォルトの名無しさん
垢版 |
2014/02/27(木) 22:04:56.98
>>839
ExceptとIEqualityComparer
2014/02/28(金) 07:34:04.60
>>839
手元に開発環境がないので想像で書いてみた。
こんなんで動くかどうか?
DataSetA.AsEnumerable().Where(p => !DataSetB.AsEnumerable().Any(q => p["c1"] == q["c1"] && p["c2"] == q["c2"] && p["c3"] == q["c3"]))
2014/02/28(金) 09:32:52.42
LINQとは関係ないけど、データが入ってるのはDataSetじゃなくてDataTableじゃね?
2014/03/02(日) 01:29:42.61
VS2010 ExpressでもLINQって使うこと出来ますか?
2014/03/02(日) 10:37:45.85
使える
2014/03/03(月) 04:06:49.30
>>841
こんな見ただけでダメそうなLINQはそうみない
2014/03/18(火) 19:59:38.45ID:KuFpHuZU
LINQで二重ループってどうやるの
2014/03/18(火) 20:28:03.79ID:fyZmNFyl
抽象的すぎるが
SelectManyとかfrom ... from ... とかか?
2014/03/18(火) 21:59:24.11ID:t6+ilvFS
>>846
今のところ拡張メソッドを使うのが一番すっきりする
2014/06/24(火) 21:43:22.43ID:auzJY4V3
LinQ瑞稀もえ、契約解除で脱退
http://headlines.yahoo.co.jp/hl?a=20140624-00000026-nksports-ent
2014/09/29(月) 13:43:24.17ID:WJqfJJMH
クエリ式とメソッド式どっちが多いの?
DB苦手でメソッド式なら手続っぽくて難無く書けるんだがクエリ式はSQLに脳内変換しないと書けなくイライラするんだよね
2014/09/29(月) 14:13:48.21ID:LeZLkHlG
クエリ式はPro*Cっぽくて好き
2014/09/29(月) 14:45:40.59ID:AA4yap2H
メソッドの方が一行プログラムみたいで好き
他のメソッドをあれだけ続けたら普通怒られるのにLINQだと怒られないから好き
2014/09/29(月) 20:06:06.06ID:GUUpSYqu
SQLと同じ単語使いながらも文法違うのがきついので専らメソッドです
854デフォルトの名無しさん
垢版 |
2014/09/29(月) 21:44:36.61ID:rcWkwNUG
コンパイルで結局メソッド式に変換されるし
クエリ式で出来ないメソッドもあるし
他の部分のコードと見た目が変わるし
SQLと順序が違うからメソッド式だな
2014/09/29(月) 22:49:21.60ID:UhIIV3Gj
fromが2つ以上出てくるときはクエリ式かな
SelectManyはめんどい
2014/10/05(日) 19:55:39.42ID:2wdLebDo
SQLならなんとか基本を覚えたけどLINQとかXMLってめんどうなら覚えなくても生きていけるんでしょ?
2014/10/05(日) 21:49:59.61ID:ecfyL29T
別にSQL覚えなくても生きる世界を選べば生きていけるよ
2014/10/05(日) 21:59:45.14ID:FUXuY2e6
このスレの最初の方見れば、覚えるのと覚えずにいるのとどちらが面倒か判ると思うんだが
2014/10/05(日) 22:26:58.92ID:IdZmMisI
やはり普及しなかったか。
2014/10/11(土) 21:04:00.40ID:GwKKohNt
Java8でStramAPI導入されたし、今後増えてくんじゃね。
個人的には今の時点でも普及してると思うけど。
2014/10/14(火) 07:44:14.82ID:wStWNn2s
もうLINQ知らんVB厨でも知らずに呼び出してそうだが
862デフォルトの名無しさん
垢版 |
2014/10/14(火) 21:09:42.81ID:Qn24ycet
ForEachとかParallel.Forとか
高度なことを簡単に書けるから凄いよな。
入社して既存ソース見てへーと思って
バンバン使ってる若い人とか多そう
2014/10/15(水) 12:40:46.07ID:N3j8OVMy
屁ぇとも思わない
2014/10/15(水) 13:09:50.89ID:SsPXo7Vr
Rxなんかは初めての人は戸惑うだろうけど
LINQは拡張メソッドで逐次処理してるだけで難しい所なんてないだろ…。
2014/10/15(水) 19:34:24.02ID:BXVP11cM
それが未だにラムダ式の記述とかに嫌悪感示す人多いんだな・・・
この記事見て段階的に覚えるのも手だと思うんだが、結果一緒なら別に良いって人相手にはどうもにならん
http://www.atmarkit.co.jp/fdotnet/chushin/roadtolinq_01/roadtolinq_01_02.html
2014/10/15(水) 20:11:42.55ID:+Cxhex9V
大手SIer()とかでラムダ式禁止ってコーディング規約が出てくるのはむしろこれからが本番。
2014/10/15(水) 20:24:32.94ID:hrBmyTxM
そういう奴等が死に絶えるまで、どうやって生き延びるかだよなw
2014/10/16(木) 13:52:30.47ID:6vjTSFjE
ポインタが理解できずにCから逃げたコボラーとか実際に存在するから
Linq程度が理解できなくても不思議じゃないわ
2014/10/16(木) 19:39:02.40ID:i0dYtbuj
保守、テストに向かないラムダ式が業務コードに採用されることはない。
採用okした馬鹿SEがいたら初めから保守する気がないやっつけプロジェクトだと客は思え。
2014/10/16(木) 20:34:37.25ID:6YdcwtfE
保守、テストに向く向かないの基準は?
2014/10/16(木) 21:13:46.98ID:i0dYtbuj
当然予算である。分りきったこと。
2014/10/16(木) 21:22:34.15ID:6YdcwtfE
お前の言ってること理解するの無理そうだわ
2014/10/16(木) 21:26:50.67ID:i0dYtbuj
おまえがPMになる頃に分るよ。LINQ?ないでしょ!!と言うようになる。
2014/10/16(木) 21:32:16.90ID:6YdcwtfE
PMってアスペでもできるんだ…
2014/10/16(木) 21:33:13.95ID:JIq8zDai
相手を納得させる説明ができない場合、相手の理解能力の不足へと責任を転嫁します
2014/10/16(木) 21:44:06.18ID:i0dYtbuj
>>874
ほんとアスペ連呼厨はアスペはだったな。じゃあ予算以外に何の基準あると言うの?
何の説明もなしに理解できない連呼して突然に脈絡もなくアスペとか言われてもな意味不明。

それとも基準と言ってるのはもしかして、
LINQが保守しにくいという理由が分らないという素人PGレベルの話?w
さすがにそれはこっちも想定外。相手は素人の客ではなくPGだと思って話しているから。ブログラム板だし。
2014/10/16(木) 22:54:35.36ID:6YdcwtfE
プログラム板だから技術的な観点から保守・テストの向き不向きを聞いたつもりだったんだが、唐突に予算の話だからさっぱりだったんだ…
聞き方が悪かったな
2014/10/16(木) 23:18:46.93ID:/G2R7ViG
>>876

> LINQが保守しにくい

自分がバカですって自白してるの?
2014/10/17(金) 01:41:05.30ID:jEl4dhul
プログラム技術の板なのになんでいきなりプログラム技術のレイヤーすっ飛ばして予算がどうこう言い出すんだ
いずれにしろ「分かりきった事だ」しか言ってないし
880デフォルトの名無しさん
垢版 |
2014/10/17(金) 01:43:38.66ID:KUlLf+fJ
LINQが分かる保守要員は単価が高いとか
2014/10/17(金) 04:18:11.25ID:y4CtUirl
多少単価が上がっても、それを上回る生産性があればペイするわけで
規模も生産性も無視して予算って言われてもなぁ
まともなマネージャーの発言とは思えん

まあ俺がプログラマなら、クエリ式はともかく今時メソッド式すら禁止でプログラム組みたくないが
2014/10/17(金) 06:28:12.62ID:BQDquYYG
>>879
馬鹿かおまえは。保守性の基準とプログラム技術に何の関係があるんだ。

マ板行け、低学歴。
2014/10/17(金) 09:09:57.62ID:O3Ha9Xaq
他に誰も読めないからC言語禁止、BASICで書け、とか言って滅んでいった馬鹿が
たくさんいたわけだが、滅んでいった奴のことは誰も覚えてないから、あとからあとから
同じような馬鹿は居るわけだよなw
2014/10/17(金) 11:26:54.10ID:ztI0lRaF
適切な粒度のLINQが一番保守しやすい。

でもLINQで複雑なの組むと保守し辛いのには同意する。
かと言って何重にもネストしたforeachの保守性が優れているかって言うとそうでもないしなー。

チーム開発では、副作用あるようなのはforeachに任せて、LINQではデータの抽出に専念するみたいな何らかの指標は必要だと思う。

「馬鹿には扱えないから禁止な!」って言われるような地獄じゃなかった事を心底嬉しく思うわ…そういう環境の人はご愁傷様。
2014/10/18(土) 08:25:15.69ID:N4WCWzJQ
COBOLのプロジェクトに必ずいるよな。Perlでいいじゃんという馬鹿が。
2014/10/18(土) 10:47:32.67ID:z8db1sck
RxのサブプロジェクトのIxは皆使わないのかな?
https://www.nuget.org/packages/Ix-Main/
余り話題にならないようだが
2014/10/19(日) 06:28:27.49ID:Ug95Fahb
>>886
何それ?と思ってググってきた。
http://gushwell.ldblog.jp/archives/52257023.html

痒いところに手が届く感じが嬉しいな。
この中のいくつかは自分で似たようなの作って使ってたわ
2014/10/19(日) 13:32:20.74ID:fmyCWKK2
ラムダ式禁止ってLINQのIEnumerableな拡張メソッドまでならいいのか?
2014/10/19(日) 14:47:06.09ID:TzxHDjoa
昔懐かしき匿名デリゲート使えばいいとかご苦労さんだよな

int[] arr = { -3, -2, -1, 0, 1, 2, 3 };
var e = arr.Where( delegate( int n ){ return n < 0; } );
2014/10/19(日) 14:51:24.13ID:OT6uOxYP
>>889
ラムダ式覚える気無い人から、xじゃわからないからこう書けよって言われそうで怖い
流石にデリゲートは知ってるよな・・・
2014/10/19(日) 17:46:05.17ID:Ug95Fahb
var arr = { -3, -2, -1, 0, 1, 2, 3 };
foreach (var item in arr.Where( x => x < 0 ))

arrをvarにしてラムダ式の()とreturn省略してforeachに突っ込んだら発狂して死ぬんじゃなかろうか?
2014/10/20(月) 00:00:11.38ID:sNo35b4/
>>887
準公式でForEachが定義されているだけでも使う価値がありますわ
2014/10/20(月) 02:40:31.01ID:dDC6hlm3
このスレはオワコン臭が半端ねーな。
2014/10/20(月) 10:59:30.63ID:grN5nCeO
出たばっかりの2008年当時は、皆手探りで専用スレに情報を集約する必要があったけど
今では.NET開発者の間に根付いて、初心者質問スレで普通にやり取りされるようになってるからね。

LINQ専用スレは役目を終えた感がある。
2014/11/07(金) 19:33:17.04ID:Uqmk+GoL
LINQの大冒険てなに?
2014/11/08(土) 05:44:51.34ID:4oPVaJN5
リンクの冒険ならゼルダの伝説2作目
2014/11/08(土) 06:09:31.24ID:/bwN1tJ/
最初のころ友人に「リンク?リンキューって読むんだよ」って教えられて信じた俺は負け組
2014/11/08(土) 14:37:10.40ID:6TnQOBwl
>>897
おれなんかラインキュー?だったぞw
2014/11/08(土) 15:44:34.92ID:tdIoNnK+
LINQってどう使うんだろうと思ってたけど、
使い方が解ると糞便利過ぎて吹いた。
2014/11/08(土) 16:14:34.06ID:SdfgCKME
linqとかgenericとかそんなもん覚えて
嬉しそうに使っている奴らは馬鹿じゃあ
ないかと思う。俺みたいなレベルになると
そんなもんは使わない。何故なら難しいから。
2014/12/28(日) 13:29:00.59ID:u+9X44C3
つまんね
11点
2015/02/01(日) 01:19:30.25ID:h1yaZPC8
でる でる
でる でる
2015/02/10(火) 19:06:51.43ID:8+t6RdsT
なんだこれPLINQで何がどう並列化されるか理解してない典型じゃん…
ttp://www.atmarkit.co.jp/fdotnet/csharp4/csharp4_03/csharp4_03_03.html
2015/02/12(木) 11:54:05.46ID:RvtVdJIV
PLINQは「C#によるマルチコアのための非同期/並列処理プログラミング」を読んで理解した
他にも多数
2015/02/14(土) 13:20:03.23ID:+2HgOaot
>>903
「ちなみに、筆者は〜」
以降が言いたかったんじゃないの
2015/07/02(木) 08:51:48.28ID:D2cUXZKe
>>903
この人内容もさることながら毎回オーバーな言い回しが好きだよね。もっと淡々と書いてほしい。
907デフォルトの名無しさん
垢版 |
2015/07/23(木) 13:28:14.95ID:8sgAL201
LINQ初心者なんですが、JOIN ON の後に固定文字の条件(o.type_flg Equals "1")を追加したいのですが、
以下の様に書くとエラーになります。
どの様に書けば良いか教えて頂けないでしょうか?
From l In db.table_sub _
Join m In db.table_hist.DefaultIfEmpty On l.cd Equals m.cd _
Join n In db.table_type.DefaultIfEmpty On m.cd_type Equals n.cd_type _
Join o In db.table_jobtype.DefaultIfEmpty On m.cd Equals o.cd And _
m.startdate Equals o.startdate And o.type_flg Equals "1" _  ←"1"この部分
Join p In db.table_office On m.officeid Equals p.officeid _
Where _
l.officeid = pofficeid(cnt) And _
l.startdate <= pDate And _
l.enddate > pDate
2015/07/23(木) 19:33:32.73ID:lwPsZC44
メソッドチェイン以外は分りかねます
レス数が900を超えています。1000を超えると表示できなくなるよ。