Linq中的In运算符

Linq中的In运算符,linq,linq-to-sql,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

我尝试使用这里提供的建议在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

大多数答案都涉及预先确定的字符串数组列表,在我的例子中,该列表不起作用


谢谢

对我来说就像是一个加入:

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。。。但我个人会加入。

对我来说就像是一个加入:

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。。。但我个人会选择加入。

这里是一个高效且可读的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;

看,妈妈!!无连接;-)

下面是一个高效且可读的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;

看,妈妈!!无连接;-)

连接存在于SQL级别是有原因的。我可能错了,但这可能会导致性能下降,因为在这种情况下,只有一小部分记录是真正匹配的。如果是这种情况,那么“高效”应该在前面加上条件。@pst:我认为您不理解LINQ(过度表达式树)。如果您认为所有字段都是从数据库中提取的,那么您就错了。LINQ到SQL将把它转换为一个性能非常好(而且是单个)的查询。还要注意的是,LINQ to SQL将把它转换为一个带有连接的SQL查询,并且能够这样做是因为生成的模型的元数据。连接存在于SQL级别是有原因的。我可能错了,但这可能会导致性能下降,因为在这种情况下,只有一小部分记录是真正匹配的。如果是这种情况,那么“高效”应该在前面加上条件。@pst:我认为您不理解LINQ(过度表达式树)。如果您认为所有字段都是从数据库中提取的,那么您就错了。LINQ到SQL将把它转换为一个性能非常好(而且是单个)的查询。还要注意的是,LINQtoSQL将把它转换为一个带有连接的SQL查询,并且能够做到这一点,因为生成模型的元数据。