2016-10-01 16 views
1

私はLINQの非常に基本的なものしか持っていません。私はSQLとJDBCを話し、LINQ Entity Frameworkに動的PL/SQLを変換することを任されています。条件付きWHERE句をLINQクエリに追加するにはどうすればよいですか?ここで(型情報を除外)非常に簡単な例です:LINQ Entity Frameworkへの動的SQL

Q1 := 'SELECT bDay = b.birthday 
      address = b.address 
     FROM (' ; 

Q2 := 'SELECT folks.birthday, Address.address 
     FROM folks, 
      (SELECT state, 
        surname AS name 
      FROM Individuals, Addresses 
      WHERE Individuals.addrId = Address.id 
      AND Addresses.state = 'CA') find1 
      ,(SELECT state, 
        surname AS name 
      FROM Individuals, Addresses 
      WHERE Individuals.addrId = Address.id 
      AND Addresses.state = 'NV') find2 
    AND find1.state(+) = folks.state'; 

IF input_parm = 'RED' THEN 
    condAddOn :=condAddOn || 'AND folks.vacationHouse IS NOT NULL'; 
END IF; 
IF input_parm = 'BLUE' THEN 
    condAddOn :=condAddOn || 'AND folks.vacationHouse = 'Cabin'; 
END IF; 
... 
OPEN curs FOR Q1 || Q2 || condAddOn ')b'; 

C#/ LINQの構文を把握しようとすると、ここでの私の試みは、(作業ボトムアップ)である:

var find1 = (from addr in Addresses 
      from indiv in Individuals 
      where indiv.addrId = addr.addrID 
      select new 
      { 
       indiv.state, 
       indiv.surname 
      }); 

var find1OuterJoin = (from person in folks 
         join f1 in find1 on person.addrId equals f1.addrID 
         from f1OutJn in temp.DefaultIfEmpty() 
         select new 
         { 
         f1OutJn.state, 
         f1OutJn.surname 
         }); 

var Q2 = (from person in folks 
      from addr in addresses 
      from f1 in find1OuterJoin 
      where person.addrId == addr.addrId 
      && f1.state == folks.state 
      select new 
      { 
      person.birthday 
      ,addr.address 
      }); 

var Q1 = (from q2 in Q1 
      select new 
      {bDay = b.birthday 
      ,address = b.address 
     }); 

私はドン」私が正しく 2 Q2にQ1を導入した場合、T句 が同等のカーソル文で終わるためにWHEREダイナミックを導入する方法) 1)を知っている:

OPEN curs FOR Q1 || Q2 || condAddOn ')b'; 

Added:動的ビットを含めるために関数または式を使用できますか?私はExpressionとExpandable()への参照を見ましたが、わかりません。 追加:LINQクエリでの試行

答えて

2

whereメソッドをリンクで使用すると、IQueryableオブジェクトが返されます。あなたもAsQuerably拡張メソッドを使用することができますラムダ、LINQを使用する場合は特に、他のリンク事業者向け

var results = from person in folks 
       join addr in addresses 
       where person.addrId == addr.addrId 
       select new { 
        person.birthday, 
        addr.address 
        }; 
if(predicate){ 
    results = from r in results 
       where /* new condition here */ 
       select r; 
} 
var resultSet = results.ToList().AsEnumerable(); 

:これはすぐにそれゆえ、次の操作を行うことが可能である、文を実行しません。限定

などではなく:

var results = folks.join(address, 
       person => person.addrId, 
       addr => addr.addrId 
       (person, addr) => new { 
              person.birthday, 
              addr.address 
             }).AsQueryable(); 
if(predicate) 
{ 
    results = results.where(/*predicate for the where condition*/); 
} 
var resultSet = results.ToList().AsEnumerable(); 
+0

は説明をいただき、ありがとうございます。私はそれが私を始められると思う:-) – frododot

関連する問題