2017-04-11 13 views
1

このエンティティフレームワークのlinqクエリを変更する方法を知りたいと思います。Entity Framework LINQクエリ

私は、次の列を持つにtableAがあります。プロジェクト(varchar型)、コード(varchar型)、評価(整数)

コードデータは階層構造になっている - つまり10011、10012は、10013 ..etcは、コードの子であります1001もう一つの例123001、123002、12300、12301私は、クエリは、プロジェクトに基づいて、その後、コードのすべての行を通過し、= 0(たとえば)

評価を持つすべてのそれの子供たちを取得するコード1230

の子であります

以下のコードを書きましたが、正しい結果が得られません:

var result = db.tableA.AsQueryable(); 
var tempResult = result.Where(p => p.project.Equals(ProjectValue)); 
result = tempResult.Where(c => c.Code.StartsWith(c.Code) && c.assess== 0); 

上記のクエリは、あなたの質問に与えてくれたコンテキストの量と、私は今考えることができますプロジェクト等しい「ProjectValue」

+0

実際にプロジェクトに保存されるものは何ですか?子供たちは同じプロジェクトを共有しないのですか?また 'c => c.Code.StartsWith(c.Code)'を選択していると言っています。これは常に自分自身と照合しているので、常にすべてのデータです。あなたはあなたが探しているc.codeを定義する必要があります – Armin

+0

子供たちは同じプロジェクトを共有していません。当初は、プロジェクト= 'ABC'のすべてのアイテムを照会したいのですが、主テーブルからすべての子コードを取得したいのですが、評価0の場合は – ibrahim

+0

以下のように更新された回答は – Armin

答えて

1

最小の長さのコードが親であると仮定します。 親を選択すると、親コードで始まり親コードと異なる長さのすべてのレコードを取得するだけです。

var result = db.tableA.AsQueryable(); 
var minLength = result.Select(t => t.Code.Length).Min(); 
var tempResult = result.Where(p => p.project.Equals(ProjectValue) && p.Code.Length == minLength); 
result = result.Where(c => tempResult.Any(d => c.Code.StartsWith(d.Code)) && c.assess== 0 && c.project.Equals(ProjectValue) && c.Code.Length != minLength); 
0

最も近いものコードの子を返しますされていませんなってしまう:あなたは子供やtempResultで親を持っているので、親がいないあなたの条件STARTSWITHは常にtrueになる場合、これを実行するために、であるレコードを知っておく必要があり

var result = db.tableA.AsQueryable(); 
var tempResult = result.Where(p => p.project.Equals(ProjectValue)).select(p => p.code); 
result = result.Where(c => tempResult.contains(c.Code.substring(0, 4)) && c.assess== 0 && c.project.Equals(ProjectValue)); 
+0

tempResult.contains(c.Code。部分文字列(0、4))は、c.project.Equals(ProjectValue)がtrueのときに常にtrueになります –

関連する問題