2017-04-13 15 views
1

SQLクエリをLINQに変換する際に問題があります。私はそれの95%が、私はクエリを実行すると、これまでSQLクエリをLINQに変換する - 演算子 '&&'を 'int'型と 'bool'型のオペランドに適用できません

var query = from table1 in table 1 
      join table2 in table 2 on table1.Column1 equals table2.Column1 && table2.Column2 == 1838 into result 
      from table2 in result.DefaultIfEmpty() 
      where table1.Column2 == 1 && table1.Column3 == 24029 && (table2.Column3 == null || table2.Column3 == 1) 
      select table1.Column1; 

私はこの時にエラーが発生します

SQL

SELECT 
    table1.Column1 
FROM 
    table 1 table1 
LEFT OUTER JOIN 
    table 2 table2 ON table2.Column1 = table1.Column1 
        AND table2.Column2 = 1838 
WHERE 
    table1.Column2 = 1 
    AND table1.Column3 = 24029 
    AND (table2.[Column3] IS NULL OR table2.[Column3] = 1) 

LINQに参加するにLINQが持つ問題に複製があると思いますライン

join table2 in table 2 on table1.Column1 equals table2.Column1 && tabl2.Column2 == 1838 into result 

エラー:

CS0019 Operator '&&' cannot be applied to operands of type 'int' and 'bool'

お願いします。

+5

のようなものを使用することができます - しないでください。 LINQは単なるクエリ言語です。一方、* Entity Framework *は* ORM *です。 *オブジェクト*をテーブルにマップします。リレーションとナビゲーションのプロパティを持つ*適切なエンティティを作成すると、EFはJOIN文を生成します。 –

+1

あなたのエンティティがOrderとLineItemであると仮定すると、各LineItemにOrderプロパティを持たせることができます。 Orderには 'LineItems'コレクションがあります。オーダーとすべての広告申込情報を読み込む場合は、単にオーダーを読み込むことができます。そのLineItemsには –

+1

がロードされます。この 'From table 1 table1'は有効ではありません。また、表1の表1からもそうではない。そのような名前にはスペースがあってはいけません。また、 'table2.Column2 = 1838'はSQLのjoinのon節でなく、Linq joinで絶対にそこに存在することはできません。 – juharr

答えて

2

Linqは、結合のon節に関して、SQLよりも厳密です。基本的には、equalsの片面のものと反対側のものを比較します。 equals==のようではなく、論理演算子を使用してさらに多くの論理を最後に連結することはできません。最良の方法は、テーブル間の関係を構成する列を結合のon節に入れることです。

join table2 in table_2 on table1.Column1 equals table2.Column1 into result 

その後where

where table2.Column2 == 1838 
     && table1.Column2 == 1 
     && table1.Column3 == 24029 
     && (table2.Column3 == null || table2.Column3 == 1) 

table2.Column2 == 1838を移動する代わりに、これも動作しますが、実際のベストプラクティスではありません。そのよう

join table2 in table_2 
on new {table1.Column1, Column2 = 1838} 
equals new {table2.Column1, table2.Column2 } into result 

あなたが複数の比較を行う方法ですが、それだけであなたが論理的な句のいずれかのタイプを行うことができるようになるSQLとは異なり、平等を行います注意してください。

は、別の方法としては、EFを使用している場合や表を使用すると、ナビゲーションプロパティを持つ必要があり、外部キー関係を持っていて、

from table1 in table_1 
from table2 in table1.table_2s.DefaultIfEmpty() 
.... 
+0

説明と修正のための@おかげで感謝します。そのため、結合ステートメントでは1つのequalだけが許可されるという考えが得られました。私はそれをwhere句に移動して、私が同じ結果を得ることができるかどうかを見てみましょう。また、EFに関するアドバイスをいただき、ありがとうございます。 – Kevin

+0

しかし、1つの質問ですが、なぜ新しい列{table1.Column1、Column2 = 1838} 'に2行目のテーブル参照名をこの行に入れる必要はありませんか? – Kevin

+1

@Kevinこの場合、匿名クラスを作成しています.2番目のプロパティの値は1838で、名前は 'Column2'で、他の匿名クラスと一致します。基本的に、匿名クラスのプロパティを参照する場合、そのプロパティ名が使用されますが、定数値の場合はプロパティの名前を付ける必要があります。したがって、別の書込み方法は 'new {Column1 = table1.Column1、Column2 = 1838} はnew {Column1 = table2.Column1、Column2 = table2.Column2}' – juharr

4

composite key joinのためのLINQの構文が異なるような何かを行うことができます。だからではなく、間違った

join table2 in table_2 on table1.Column1 equals table2.Column1 && table2.Column2 == 1838 into result 

のあなたが最善のアドバイスがあり、この

join table2 in table_2 
on new { table1.Column1, Column2 = 1838 } equals new { table2.Column1, table2.Column2 } 
into result 
+0

Hmm ... Is 「深いが等しい」、あるいは単に参照が等しいこと –

+1

@RobertHarvey C#のアノニマス型は、値比較のセマンティクスを持っています。同じテクニックが複合キーごとに使用されているため、参照平等であれば明らかに機能しません。 –

+1

@RobertHarveyこの場合も、とにかくSQLに変換されている可能性があります。 – juharr

関連する問題