На первую часть вопроса ответил Михаил Stancescu, спасибо!
На вторую часть еще не ответили правильно.Поиск Azure - это решение, но это совершенно другой сервис.Я хочу решить эту проблему в своем классе репозитория.И я решил это.
Может быть, кому-то еще интересно, поэтому я делюсь своим решением:
За решением В AzureBlob есть метаданные, которые имеюттип строки.Я сериализовал объект в строку и сохранил эту строку в метаданных.Когда мне нужна эта информация в любом случае, я перечисляю метаданные в ней.Эта функциональность достигается при передаче значения Microsoft.WindowsAzure.Storage.Blob.BlobListingDetails.Metadata в параметр blobListingDetails в функции ListBlobs .
Когда прибыли большие объекты, я сразу же десериализовал обратно из JSON объект.Этот механизм отображается в LINQ Select:
.Select<Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob, T>(blob = > JsonConvert.DeserializeObject<T>(blob.Metadata["data"]))
После этого тип LINQ - T, поэтому я могу применить к нему выражение в LINQ Where.
Полное решение:
Функция GetMany
public IEnumerable<T> GetMany( Expression<Func<T, bool>> filter )
{
return _AzureBlobCollection.BlobDirectory
.ListBlobs( useFlatBlobListing: false, blobListingDetails: Microsoft.WindowsAzure.Storage.Blob.BlobListingDetails.Metadata )
.OfType<Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob>()
.Select<Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob, T>( blob => JsonConvert.DeserializeObject<T>( blob.Metadata[ "data" ] ) )
.Where( filter.Compile() );
}
Эта функция может вызываться следующим образом: Репозиторий репозитория = ..
IEnumerable files = repository.GetMany( f => f.Partner = "Microsoft" );
Базовые классы
, где класс файла:
public class ContractFile : File
{
public string Partner { get; set; }
public Date CreationDate { get; set; }
public string Remarks { get; set; }
public string Filename { get; set; }
}
...
public class File
{
public String File { get; set; }
public Stream Data { get; set; }
}
И вставка следующая:
public void AddOne( T file )
{
file.id = Guid.NewGuid().ToString();
Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob blob = _AzureBlobCollection.BlobDirectory.GetBlockBlobReference( file.id );
blob.UploadFromStream( file.Data );
blob.Metadata.Add( "data", JsonConvert.SerializeObject( file ) );
blob.SetMetadata();
}