2010-12-06 9 views
0

私はlinqのIn演算子を使用するためにここで提供されている提案を使用しようとしましたが、私の要求をLINQ文に変換できません。Linqのオペレータで

以下は、私は、これが効率的なのLINQに変換したい私は、LINQの

select * 
from navigator_user_field_property 
where user_id = 'albert' 
and field_id in (
     select field_id 
     from navigator_entity_field_master 
     where entity_id = 1 
     and use_type = 0) 
order by field_id 

に変換する必要がSQLクエリです。

ほとんどの回答は、私の場合は動作していない文字列配列の所定のリストを処理します。

おかげ

答えて

2

が私に参加するようになっています。同じIDを持つ複数のフィールドがある場合、これは、同じ値を複数回返すこと

var query = from navigator in db.NavigatorUserFieldProperties 
      where navigator.UserId == "albert" 
      join field in db.NavigatorEntityFieldMasters 
          .Where(f => f.EntityId == 1 && f.UseType == 0) 
      on navigator.FieldId equals field.FieldId 
      select navigator; 

注 - しかし、私はそうではありません疑います。

あなたこのような、より直訳行うことができます:

var query = from navigator in db.NavigatorUserFieldProperties 
      where navigator.UserId == "albert" && 
       db.NavigatorEntityFieldMasters 
        .Where(f => f.EntityId == 1 && f.UseType == 0) 
        .select(f => f.FieldId) 
        .Contains(navigator.FieldId) 
      select navigator; 

を...と同じSQLに変換することになるかもしれない...しかし、私は個人的に参加して行くだろうと。ここで

1

は、効率的で読みやすいLINQクエリです:

var fields = 
    from field in db.navigator_entity_field_masters 
    where field.entity_id == 1 && field.user_type == 0 
    select field; 

var properties = 
    from property in db.navigator_user_field_properties 
    where property.user_id == "albert" 
    where fields.Contains(property.field) 
    select property; 

ルックママ!!結合なし;-)

+0

SQLレベルに結合が存在する理由があります。私は間違っている可能性がありますが、これは引っ張られたレコードのほんの少数しか実際には一致しない場合、パフォーマンスが低下する可能性があります。そうであれば、「効率的」に条件を付けるべきです。 –

+2

@pst:LINQ(over expression trees)を理解しているとは思えません。すべてのフィールドがデータベースから引き出されたと思うと、あなたは間違っています。 LINQ to SQLはこれを非常に優れた(そして単一の)クエリに変換します。また、LINQ to SQLは、これを結合によるSQlクエリに変換し、生成されたモデルのメタデータのためにこれを行うことができます。 – Steven