2010-12-06 59 views
0

我试着使用这里提供的建议在linq中使用In运算符,但是我无法将我的需求转换为LINQ语句。Linq中的运算符

下面是SQL查询,我需要转换到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 

我希望这可以转换为有效的Linq。

大部分的答案处理预先确定的字符串数组列表,这不适用于我的情况。

感谢

回答

2

貌似加盟对我说:

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; 

注意,这会多次返回相同的值,如果有具有相同ID的多个领域 - 但我怀疑这是不是这样的。

可以做更直译是这样的:

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级别存在连接存在的原因。我可能是错的,但这可能会导致退化的表现,只有一小部分拉的记录是真正匹配的。如果是这样的话,那么“有效率”应该以条件为前提。 – 2010-12-06 12:55:34