Linq中的In运算符
我尝试使用这里提供的建议在linq中使用In运算符,但我无法将我的需求转换为linq语句 下面是我需要转换为Linq的SQL查询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
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查询,并且能够做到这一点,因为生成模型的元数据。