Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在中将LINQ查询写入sql_C#_Linq - Fatal编程技术网

C# 如何在中将LINQ查询写入sql

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

我想查询我的cosmosDB以获取ZonesDO&&类型的文档列表,其id在UserPreference中。我的UserPreference类是:

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
已经返回了一个序列f
ZoneDo

如果没有,并且返回的序列中还有其他类型,请使用类型的
而不是检查返回对象的字符串表示形式:

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
已经返回了一个序列f
ZoneDo

如果没有,并且返回的序列中还有其他类型,请使用类型的
而不是检查返回对象的字符串表示形式:

IQueryable<ZoneDO> allZoneDOs = DbUtil.Client
    .CreateDocumentQuery<ZoneDO>(CollectionUri)
    .OfType<ZoneDo>();
IQueryable allZoneDOs=DbUtil.Client
.CreateDocumentQuery(CollectionUri)
.of type();
不需要可计算的
IQueryable.ToList()
将执行查询并转换da