2016-10-13 8 views
1

オク、私は2つの質問があります。C#、MVC4 - EF Linq検索

---------------------------------------------- 
|  | column1 | column2 | column3 | ... | 
---------------------------------------------- 
| row1 | "1,2,3,4" | "5,6,7,8" | "9,a,b,c" | ... | 
---------------------------------------------- 
| row2 | "d,e,f,g" | "h,i,j,k" | "l,m,n,o" | ... | 

各セルは4が含まれています。最初は、のiは、各セルはそのようなVARCHAR(100)のように定義される「stringData」という名前のデータテーブルを保持している「EntitiesDefinitions」と呼ばれるEFを、持っているとしましょう、ですコンマで区切られた情報だから私が知りたいのは、column1のすべてのセルの2番目の情報を(例として)Linqで検索する方法があれば?

using (EntitiesDefinitions ef = new EntitiesDefinitions()) 
{ 
    var v = (from a in ef.stringData where (a.column1... == "e") select a); 
} 

私はちょうどセル当たり4列(column1_1、column1_2、... column2_1、column2_2、...)を作ることができる知っているが、私は250元の列を持つテーブルを取得する場合には動作しないでしょう。そのような検索を実行する方法はありますか?

その他の質問もこれに関連しています。戻るASP.NETで私はこのような文字列を使用して、私のSQLにクエリを送信できます。

var stringSql = "SELECT * FROM" + "stringData" + "WHERE ([" + "column1" + "] =" + "e" + ")" + "ORDER by ["+ "column1" +"] ASC;" 

基本的に、私はそのプロパティ/列を表す与えられた文字列値を検索するためにどのテーブルを定義することができます。 EFのlinqsでそれを行う方法はありますか?

using (EntitiesDefinitions ef = new EntitiesDefinitions()) 
{ 
    var v = (from a in ef.stringData where (a.["column1"]... == "e") select a); 
} 

私はMVCとEFでかなり新しいので、これが可能かどうかを知りたいと思います。

+0

250 columns .... C#の前にも、テーブルをcolumn_name、column_valueのコレクションにアンピボットするビューを作成してデータベースを修正することをお勧めします。次にlinqを使用してビューから選択し、あなたが必要とするものをしてください –

+0

さて、N +(250 * 4)列まで拡張できる元の250本の列。限界を超えています。これは、共通のID列で結合された2つの並列テーブルを作成することで簡単に解決できます。しかし、私はすべてをただ一つに保ちたい。しかし、私は、複数の区切り記号でlinq検索セルを見つける方法を見つけたと思います。 – MMan

答えて

0

Fehintolaの提案の後、私はそれらのテーマに固有のより多くの研究を行うことができ、両方の質問に対する解決策を見つけることができました。誰でもここに興味がある場合は、私が思いついたことがあります:

最初の質問については、エレガントではありませんが、特定の文字/区切り文字でデータをカプセル化して、ネストされた検索で検索結果を処理できます。例:これは、あなただけ動的にクエリを構築するためにsqlExample列に配置された変数を持つことができました

string sqlExample = @"SELECT VALUE a FROM ef.stringData AS a WHERE (a.column1 == '*2*')"; 
var test = ef.CreateQuery<stringData>(sql).AsQueryable(); 

とあなた:

using (EntitiesDefinitions ef = new EntitiesDefinitions()) 
{ 
    //Data could look like";1;*2*&3&#4#" 
    var v = (from a in ef.stringData where select a); //to store the table 
    v = c.Where(f => f.column1.Contains("*2*")) //look for the second value 
    v = x.Where(f => f.column1.Contains("#4.3#"));//look for the forth value 

    //Do some other stuff...like sending the data to a table 
} 

2番目の質問については、次のような生のSQLクエリを行うことができますたとえば、テーブルに渡すために使用できるIQueryableオブジェクトが返されます。

私はこれが将来誰かに役立ち、提案を提供した皆様に感謝したいと思います。

0

私はあなたの質問から理解して何からU場合は、必ずその常にnullではない、これを試してみることができます。

var res = ef.stringData.Where(c => c.column1.Split(',')[1] == "e") 

そして、あなたは「ef.stringData」テーブルの名前、あなたを入力2番目の質問のためにクエリが "stringData"である場合は、テーブル名を指定する方法が他にありません。また、EFに未処理のSQLクエリを書き込む場合にのみ使用できます。

+0

残念なことに、最初の質問に対して提案した解決策は、「LINQ式のノード型 'ArrayIndex'はLINQ to Entitiesでサポートされていません」と返されました。しかし、私はそれが、エレガントではないが、スプリットと同様の機能を実行する回避策を見つけました。 2番目の質問では、私は参照してください、私はEFで生のSQLクエリを書く方法を探して示唆ですか? – MMan

+0

よろしくお願いします。あなたが本当にそれを書くことを好む場合は、生のSQLクエリを書くようにしてください。 – Fehintola