C# 如何在中将LINQ查询写入sql
我想查询我的cosmosDB以获取ZonesDO&&类型的文档列表,其id在UserPreference中。我的UserPreference类是:C# 如何在中将LINQ查询写入sql,c#,linq,C#,Linq,我想查询我的cosmosDB以获取ZonesDO&&类型的文档列表,其id在UserPreference中。我的UserPreference类是: public class UserPreference { [JsonProperty("zones")] public List<Zone> Zones { get; set; } } 我正在尝试此查询,但无法完成它 var zones = DbUtil.Client.CreateDo
public class UserPreference
{
[JsonProperty("zones")]
public List<Zone> Zones { get; set; }
}
我正在尝试此查询,但无法完成它
var zones = DbUtil.Client.CreateDocumentQuery<ZoneDO>(CollectionUri)
.Where(z => z.Type == typeof(ZoneDO).ToString() &&
*z.Id in user.UserPreference.Zones.ids*)// here I need the solution
.AsEnumerable().ToList();
var zones=DbUtil.Client.CreateDocumentQuery(CollectionUri)
其中(z=>z.Type==typeof(ZoneDO).ToString()和
*z、 user.UserPreference.Zones.ids*)/这里我需要解决方案
.AsEnumerable().ToList();
您可以尝试使用Contain
方法
var zones = DbUtil.Client.CreateDocumentQuery<ZoneDO>(CollectionUri)
.Where(z => z.Type == typeof(ZoneDO).ToString() &&
user.UserPreference.Zones.Select(x => x.Id).Contain(z.Id)).ToList();
var zones = DbUtil.Client.CreateDocumentQuery<ZoneDO>(CollectionUri)
.Where(z => z.Type == typeof(ZoneDO).ToString() &&
user.UserPreference.Zones.Contains(z.Id))
.AsEnumerable().ToList();
您可以尝试使用
Contain
方法
var zones = DbUtil.Client.CreateDocumentQuery<ZoneDO>(CollectionUri)
.Where(z => z.Type == typeof(ZoneDO).ToString() &&
user.UserPreference.Zones.Select(x => x.Id).Contain(z.Id)).ToList();
var zones = DbUtil.Client.CreateDocumentQuery<ZoneDO>(CollectionUri)
.Where(z => z.Type == typeof(ZoneDO).ToString() &&
user.UserPreference.Zones.Contains(z.Id))
.AsEnumerable().ToList();
Linq提供程序通常了解数组/集合的基本方法。因此,您可以使用
Contains
方法
var zones = DbUtil.Client.CreateDocumentQuery<ZoneDO>(CollectionUri)
.Where(z => z.Type == typeof(ZoneDO).ToString() &&
user.UserPreference.Zones.Select(x => x.Id).Contain(z.Id)).ToList();
var zones = DbUtil.Client.CreateDocumentQuery<ZoneDO>(CollectionUri)
.Where(z => z.Type == typeof(ZoneDO).ToString() &&
user.UserPreference.Zones.Contains(z.Id))
.AsEnumerable().ToList();
var zones=DbUtil.Client.CreateDocumentQuery(CollectionUri)
其中(z=>z.Type==typeof(ZoneDO).ToString()和
user.UserPreference.Zones.Contains(z.Id))
.AsEnumerable().ToList();
Linq提供程序通常了解数组/集合的基本方法。因此,您可以使用Contains
方法
var zones = DbUtil.Client.CreateDocumentQuery<ZoneDO>(CollectionUri)
.Where(z => z.Type == typeof(ZoneDO).ToString() &&
user.UserPreference.Zones.Select(x => x.Id).Contain(z.Id)).ToList();
var zones = DbUtil.Client.CreateDocumentQuery<ZoneDO>(CollectionUri)
.Where(z => z.Type == typeof(ZoneDO).ToString() &&
user.UserPreference.Zones.Contains(z.Id))
.AsEnumerable().ToList();
var zones=DbUtil.Client.CreateDocumentQuery(CollectionUri)
其中(z=>z.Type==typeof(ZoneDO).ToString()和
user.UserPreference.Zones.Contains(z.Id))
.AsEnumerable().ToList();
在区域Id上执行选择,然后使用包含项检查以获得所需结果
var zones = DbUtil.Client.CreateDocumentQuery<ZoneDO>(CollectionUri)
.Where(z => z.Type == typeof(ZoneDO).ToString() &&
user.UserPreference.Zones.Select(x => x.Id).Contains(z.Id))
.AsEnumerable().ToList();
var zones=DbUtil.Client.CreateDocumentQuery(CollectionUri)
其中(z=>z.Type==typeof(ZoneDO).ToString()和
user.UserPreference.Zones.Select(x=>x.Id).Contains(z.Id))
.AsEnumerable().ToList();
在区域Id上执行选择,然后使用包含项检查以获得所需结果
var zones = DbUtil.Client.CreateDocumentQuery<ZoneDO>(CollectionUri)
.Where(z => z.Type == typeof(ZoneDO).ToString() &&
user.UserPreference.Zones.Select(x => x.Id).Contains(z.Id))
.AsEnumerable().ToList();
var zones=DbUtil.Client.CreateDocumentQuery(CollectionUri)
其中(z=>z.Type==typeof(ZoneDO).ToString()和
user.UserPreference.Zones.Select(x=>x.Id).Contains(z.Id))
.AsEnumerable().ToList();
另一个选项可能是使用Any()
操作符:
var zones = DbUtil.Client.CreateDocumentQuery<ZoneDO>(CollectionUri)
.Where(z => z.Type == typeof(ZoneDO).ToString() &&
user.UserPreference.Zones.Where(x => x.Id == z.Id).Any())
.AsEnumerable().ToList();
var zones=DbUtil.Client.CreateDocumentQuery(CollectionUri)
其中(z=>z.Type==typeof(ZoneDO).ToString()和
user.UserPreference.Zones.Where(x=>x.Id==z.Id).Any())
.AsEnumerable().ToList();
另一个选项可能是使用Any()
操作符:
var zones = DbUtil.Client.CreateDocumentQuery<ZoneDO>(CollectionUri)
.Where(z => z.Type == typeof(ZoneDO).ToString() &&
user.UserPreference.Zones.Where(x => x.Id == z.Id).Any())
.AsEnumerable().ToList();
var zones=DbUtil.Client.CreateDocumentQuery(CollectionUri)
其中(z=>z.Type==typeof(ZoneDO).ToString()和
user.UserPreference.Zones.Where(x=>x.Id==z.Id).Any())
.AsEnumerable().ToList();
显然你有一个用户
。此用户
具有用户首选项
,而此用户首选项
具有零个或多个区域
。似乎此用户
,以及此用户的用户首选项
的区域
在本地内存中(不在数据库中。区域
是IEnumerable而不是IQueryable)
虽然您没有指定,但似乎DbUtil.Client.CreateDocumentQuery(CollectionUri)
返回一个IQueryable
您希望所有ZoneDo
的Id都是您的用户的唯一UserPreference
中一个分区的Id
小步走:
IEnumerable<Guid> zoneIds = user.Userpreference.Zones.Select(zone => zone.Id);
IQueryable<ZoneDO> allZoneDOs = DbUtil.Client.CreateDocumentQuery<ZoneDO>(CollectionUri);
IEnumerable<ZoneDO> requestedZoneDOs = allZoneDOs
.Where(zoneDo => zoneIds.Contains(zoneDo.Id);
TODO:如果需要,将所有语句放在一个大LINQ语句中。我怀疑这是否会提高绩效。它肯定会降低可读性,从而降低可维护性
你注意到了吗,我没有做你的类型检查部分。这是不需要的,因为函数CreateDocumentQuery
已经返回了一个序列fZoneDo
如果没有,并且返回的序列中还有其他类型,请使用类型的而不是检查返回对象的字符串表示形式:
IQueryable<ZoneDO> allZoneDOs = DbUtil.Client
.CreateDocumentQuery<ZoneDO>(CollectionUri)
.OfType<ZoneDo>();
IQueryable allZoneDOs=DbUtil.Client
.CreateDocumentQuery(CollectionUri)
.of type();
不需要可计算的
IQueryable.ToList()
将执行查询并将数据转换为列表
AsEnumerable
仅当您需要本地内存中的数据继续使用不能作为IQueryable执行的LINQ语句时才需要,例如调用本地函数的LINQ语句,或不能转换为SQL的LINQ语句
AsEnumerable
将按“页面”获取请求的数据。因此,如果您只需要前(几)个元素,则不会获取完整的表,而只获取前(几)个页面。显然您有一个用户。此用户
具有用户首选项
,而此用户首选项
具有零个或多个区域
。似乎此用户
,以及此用户的用户首选项
的区域
在本地内存中(不在数据库中。区域
是IEnumerable而不是IQueryable)
虽然您没有指定,但似乎DbUtil.Client.CreateDocumentQuery(CollectionUri)
返回一个IQueryable
您希望所有ZoneDo
的Id都是您的用户的唯一UserPreference
中一个分区的Id
小步走:
IEnumerable<Guid> zoneIds = user.Userpreference.Zones.Select(zone => zone.Id);
IQueryable<ZoneDO> allZoneDOs = DbUtil.Client.CreateDocumentQuery<ZoneDO>(CollectionUri);
IEnumerable<ZoneDO> requestedZoneDOs = allZoneDOs
.Where(zoneDo => zoneIds.Contains(zoneDo.Id);
TODO:如果需要,将所有语句放在一个大LINQ语句中。我怀疑这是否会提高绩效。它肯定会降低可读性,从而降低可维护性
你注意到了吗,我没有做你的类型检查部分。这是不需要的,因为函数CreateDocumentQuery
已经返回了一个序列fZoneDo
如果没有,并且返回的序列中还有其他类型,请使用类型的而不是检查返回对象的字符串表示形式:
IQueryable<ZoneDO> allZoneDOs = DbUtil.Client
.CreateDocumentQuery<ZoneDO>(CollectionUri)
.OfType<ZoneDo>();
IQueryable allZoneDOs=DbUtil.Client
.CreateDocumentQuery(CollectionUri)
.of type();
不需要可计算的
IQueryable.ToList()
将执行查询并转换da