在Linq的运营商

时间:2010-12-06 12:03:15

标签: linq linq-to-sql

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

以下是我需要转换为Linq的SQL查询

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 个答案:

答案 0 :(得分: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 :(得分: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;

看妈妈!!没有连接; - )