Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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中使用时,如何使我的类充当Guid?_C#_.net_Linq_Linq To Sql_Azure Cosmosdb Sqlapi - Fatal编程技术网

C# 在Linq中使用时,如何使我的类充当Guid?

C# 在Linq中使用时,如何使我的类充当Guid?,c#,.net,linq,linq-to-sql,azure-cosmosdb-sqlapi,C#,.net,Linq,Linq To Sql,Azure Cosmosdb Sqlapi,我正在使用带有.NETCore2.2的Cosmosdb和Cosmosdb SQL SDK。默认情况下,cosmosdb会将每个文档的“Id”属性指定为Guid。但是单凭Id还不足以直接读取文档,还必须知道它的分区。所以我创建了一个名为CosmosGuid的类,它包含一个Id属性(Guid)和一个PartitionKey属性(string)。重写ToString()以调用Guid上的.ToString(“N”)以删除破折号,并将PartitionKey追加到末尾。我遇到的问题是,当我在Linq中使

我正在使用带有.NETCore2.2的Cosmosdb和Cosmosdb SQL SDK。默认情况下,cosmosdb会将每个文档的“Id”属性指定为Guid。但是单凭Id还不足以直接读取文档,还必须知道它的分区。所以我创建了一个名为CosmosGuid的类,它包含一个Id属性(Guid)和一个PartitionKey属性(string)。重写ToString()以调用Guid上的.ToString(“N”)以删除破折号,并将PartitionKey追加到末尾。我遇到的问题是,当我在Linq中使用CosmosGuid时,生成的SQL将包含CosmosGuid的json版本,我真的需要它只是一个字符串。我可以调用.ToString(),这将产生所需的结果,但我担心另一个开发人员会在Linq表达式中使用我的类,它会因为未知的原因而失败。当我保存CosmosGuid时,我创建了一个自定义的newtonsoft转换器,在保存时调用ToString(),在读取时调用.Parse(string)。当您在Linq中比较两个GUI时,生成的SQL将显示为一个字符串,但当我比较两个CosmosGuid时,它将创建我的类的json字符串。我怎样才能使我的类表现得像一个Guid

我已经尝试实现与Guid相同的所有接口。我来这里的目的是实现“IEnumerable”,并在GetComparer()中返回:

新字符串[]{this.ToString()}.GetEnumerator();
生成的代码非常完美,但它一直用括号[]包围着我的字符串

以下是一个例子:

从根中选择值root,其中根['id']=['9a9dbbd5f78143c48b16f780c7ceaa4011'])
这是CosmosGuid类,我想我会发布完整的类,因为它不太大,可能对某些人有用

公共类CosmosGuid
{
//这是实体的唯一Id
公共Guid Guid{get;set;}
//这是实体所在的分区键
公共字符串分区键{get;set;}
//这是包含实体的文档的唯一Id
公共Guid?父Guid{get;set;}
//这是包含实体的文档的分区键
公共字符串ParentPartitionKey{get;set;}
/// 
///将CosmosGuid字符串解析为新的CosmosGuid
/// 
/// 
公共CosmosGuid(字符串CosmosGuid)
{
ParentGuid=null;
ParentPartitionKey=null;
尝试
{
var parsed=cosmosGuid.Split('-');
//通过始终获取前32个字符,我们可以从字符串中准确地解析guid。
//前32个字符后的字符是PartitionKey。
// https://stackoverflow.com/a/4458925
//Guid.NewGuid().ToString(“N”)=>32个字符(仅限数字,无破折号)
Guid=Guid.Parse(已解析[0]。子字符串(0,32));
PartitionKey=已解析[0]。子字符串(32,已解析[0]。长度-32);
if(parsed.Length==2)
{
ParentGuid=Guid.Parse(已解析[1]。子字符串(0,32));
ParentPartitionKey=已解析[1]。子字符串(32,已解析[1]。长度-32);
}
}
捕获(例外情况除外)
{
抛出新异常(“文档的Id不是格式正确的CosmosGuid。”,ex);
}
}
/// 
///生成新Guid并附加PartitionKey。这用于文档。
/// 
/// 
/// 
公共静态COSMSGUID NewCosmosGuid(字符串分区键)
{
返回新的CosmosGuid($“{ShortenGuid(Guid.NewGuid())}{partitionKey}”);
}
/// 
///生成新Guid并附加PartitionKey以及父Guid和父PartitionKey。这用于子文档。
/// 
/// 
/// 
/// 
公共静态CosmosGuid NewCosmosGuid(CosmosGuid父级,字符串分区键)
{
返回新的CosmosGuid($“{ShortenGuid(Guid.NewGuid())}{partitionKey}-{ShortenGuid(parent.Guid)}{parent.partitionKey}”);
}
/// 
///仅返回父CosmosGuid。如果没有父级,则返回的值将为null。
/// 
公共CosmosGuid父级
{
得到
{
if(ParentGuid!=null&&ParentPartitionKey!=null)
返回新的CosmosGuid($“{ShortenGuid((Guid)ParentGuid)}{ParentPartitionKey}”);
其他的
返回null;
}
}
/// 
///将CosmosGuid字符串解析为新的CosmosGuid。
/// 
/// 
/// 
公共静态CosmosGuid解析(字符串CosmosGuid)
{
返回新的CosmosGuid(CosmosGuid);
}
/// 
///生成CosmosGuid格式的字符串。
/// 
/// 
公共重写字符串ToString()
{
if(ParentGuid==null)
返回$“{ShortenGuid(Guid)}{PartitionKey}”;
其他的
返回$“{ShortenGuid(Guid)}{PartitionKey}-{ShortenGuid(Guid)ParentGuid)}{ParentPartitionKey}”;
}
/// 
///从Guid中删除破折号
/// 
/// 
/// 
专用静态字符串ShortenGuid(Guid)
{
//只需删除guid中的破折号即可将其缩短一些。
//如果您愿意,可以在此处执行更多操作,但请确保guid唯一性不会受到影响。
返回guid.ToString(“N”);
}
公共静态布尔运算符==(CosmosGuid obj1,CosmosGuid obj2)
{
返回obj1?.ToString()==obj2?.ToString();
}
公共静态布尔运算符!=(CosmosGuid obj1,CosmosGuid obj2)
{
返回obj1?.ToString()!=obj2?.ToString();
}
}
public class CosmosGuid : IEquatable<Guid>
{

  ....

  public bool Equals(Guid other) {
    return this.Guid == other;
  }
}
.Where(x => cosmosGuid.Equals(x.Id))