AbsoluteUri IRepository <T> .ToUrn(AlphaDecimal key)
        {
            var file = GetFile(key);

            return(null == file
                       ? null
                       : RecordFile.Load(file).ToRecord <T>().Urn);
        }
        AlphaDecimal? IRepository <T> .ToKey(AbsoluteUri urn)
        {
            var file = GetFile(urn);

            return(null == file
                       ? null
                       : RecordFile.Load(file).ToRecord <T>().Key);
        }
        IRecord <T> IRepository <T> .Select(AlphaDecimal key)
        {
            var file = GetFile(key);

            return(null == file
                       ? null
                       : RecordFile.Load(file).ToRecord <T>());
        }
        IRecord <T> IRepository <T> .Select(AbsoluteUri urn)
        {
            var file = GetFile(urn);

            return(null == file
                       ? null
                       : RecordFile.Load(file).ToRecord <T>());
        }
        bool IRepository <T> .Match(AlphaDecimal key,
                                    EntityTag etag)
        {
            var file = GetFile(key);

            return(null != file &&
                   string.Equals(etag, RecordFile.Load(file).ToRecord <T>().Etag, StringComparison.OrdinalIgnoreCase));
        }
        IEnumerable <IRecord <T> > IRepository <T> .Query(XPathExpression expression)
        {
            if (null == expression)
            {
                throw new ArgumentNullException("expression");
            }

            if (null == expression.Expression)
            {
                throw new ArgumentOutOfRangeException("expression");
            }

            var files = FileRepositoryConfiguration
                        .Directory()
                        .GetFiles("*.record", SearchOption.AllDirectories);

#if NET20
            foreach (var file in files)
            {
                var obj = RecordFile.Load(file);
                if (string.IsNullOrEmpty(obj.Body))
                {
                    continue;
                }

                var selection = obj.ToXml().CreateNavigator().Select(expression.Expression);
                if (0 != selection.Count)
                {
                    result.Add(obj.ToRecord <T>());
                }
            }

            return(result);
#else
            return((from file in files
                    select RecordFile.Load(file)
                    into obj
                    where !string.IsNullOrEmpty(obj.Body)
                    let navigator = obj.ToXml().CreateNavigator()
                                    let count = navigator.Select(expression.Expression).Count
                                                where 0 != count
                                                select obj.ToRecord <T>()).ToList());
#endif
        }