mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Merge
--HG-- branch : 1.x
This commit is contained in:
@@ -26,3 +26,4 @@ glob:src/Orchard.Azure/Orchard.Azure.Web/Modules
|
|||||||
glob:src/Orchard.Azure/Orchard.Azure.Web/Themes
|
glob:src/Orchard.Azure/Orchard.Azure.Web/Themes
|
||||||
syntax: glob
|
syntax: glob
|
||||||
src/Orchard.Web/Orchard.Web.Publish.xml
|
src/Orchard.Web/Orchard.Web.Publish.xml
|
||||||
|
glob:src/TestResults/*
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
1f8f582859916d411b5333dd0f32f57da0e72ee8 src/Orchard.Web/Modules/Orchard.AntiSpam
|
1f8f582859916d411b5333dd0f32f57da0e72ee8 src/Orchard.Web/Modules/Orchard.AntiSpam
|
||||||
bb8c612e72535cbb28b03efb5f7c52e79ced61cd src/Orchard.Web/Modules/Orchard.Autoroute
|
e270989b0b0bcee22c03021af5a028215bcdefe9 src/Orchard.Web/Modules/Orchard.Autoroute
|
||||||
2ca2dbbf97b7219f9150d46d52f62bc405c17673 src/Orchard.Web/Modules/Orchard.ContentPermissions
|
2ca2dbbf97b7219f9150d46d52f62bc405c17673 src/Orchard.Web/Modules/Orchard.ContentPermissions
|
||||||
e6e70d69f37e48ea6c8784e83a9af4103f5d0dde src/Orchard.Web/Modules/Orchard.ContentPicker
|
e6e70d69f37e48ea6c8784e83a9af4103f5d0dde src/Orchard.Web/Modules/Orchard.ContentPicker
|
||||||
b5ccdaed10ff8bcd5bc94d46541209873ae0f722 src/Orchard.Web/Modules/Orchard.CustomForms
|
b5ccdaed10ff8bcd5bc94d46541209873ae0f722 src/Orchard.Web/Modules/Orchard.CustomForms
|
||||||
@@ -8,5 +8,5 @@ e57f4a5dffac99ac64e195ae6ee5f2d720876b52 src/Orchard.Web/Modules/Orchard.Rules
|
|||||||
c85cd1e9651e3e0bb1ca97442ce390bf34cf3c76 src/Orchard.Web/Modules/Orchard.TaskLease
|
c85cd1e9651e3e0bb1ca97442ce390bf34cf3c76 src/Orchard.Web/Modules/Orchard.TaskLease
|
||||||
6ce83f60624b333aa6e23e756c07181d9df40094 src/Orchard.Web/Modules/Orchard.Tokens
|
6ce83f60624b333aa6e23e756c07181d9df40094 src/Orchard.Web/Modules/Orchard.Tokens
|
||||||
1b4c795960358a84c743eeb6bd778fabbdf8455e src/orchard.web/Modules/Orchard.Alias
|
1b4c795960358a84c743eeb6bd778fabbdf8455e src/orchard.web/Modules/Orchard.Alias
|
||||||
a5b0e6345d1a316e7184d1e77905e1300390756e src/orchard.web/Modules/Orchard.Projections
|
8ca57ca0486ad535c6c5d6940ad6c4ddd71130d2 src/orchard.web/Modules/Orchard.Projections
|
||||||
01976daba529461b30b7959fd45488829cd45d3e src/orchard.web/modules/Orchard.Fields
|
01976daba529461b30b7959fd45488829cd45d3e src/orchard.web/modules/Orchard.Fields
|
||||||
|
@@ -16,6 +16,7 @@ using Orchard.Tests.ContentManagement.Records;
|
|||||||
using Orchard.Tests.ContentManagement.Models;
|
using Orchard.Tests.ContentManagement.Models;
|
||||||
using Orchard.DisplayManagement.Implementation;
|
using Orchard.DisplayManagement.Implementation;
|
||||||
using Orchard.Tests.Stubs;
|
using Orchard.Tests.Stubs;
|
||||||
|
using NHibernate.Impl;
|
||||||
|
|
||||||
namespace Orchard.Tests.ContentManagement {
|
namespace Orchard.Tests.ContentManagement {
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
@@ -451,6 +452,58 @@ namespace Orchard.Tests.ContentManagement {
|
|||||||
Assert.That(listTwo.Count(), Is.EqualTo(2));
|
Assert.That(listTwo.Count(), Is.EqualTo(2));
|
||||||
Assert.That(listThree.Count(), Is.EqualTo(1));
|
Assert.That(listThree.Count(), Is.EqualTo(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void StartsWithExtensionShouldBeUsed() {
|
||||||
|
_manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "one"; });
|
||||||
|
_manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "two"; });
|
||||||
|
_manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "three"; });
|
||||||
|
_manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "four"; });
|
||||||
|
_session.Flush();
|
||||||
|
|
||||||
|
var result = _manager.Query<GammaPart, GammaRecord>()
|
||||||
|
.Where(x => x.Frap.StartsWith("t"))
|
||||||
|
.List();
|
||||||
|
|
||||||
|
Assert.That(result.Count(), Is.EqualTo(2));
|
||||||
|
Assert.That(result.Count(x => x.Get<GammaPart>().Record.Frap == "two"), Is.EqualTo(1));
|
||||||
|
Assert.That(result.Count(x => x.Get<GammaPart>().Record.Frap == "three"), Is.EqualTo(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void EndsWithExtensionShouldBeUsed() {
|
||||||
|
_manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "one"; });
|
||||||
|
_manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "two"; });
|
||||||
|
_manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "three"; });
|
||||||
|
_manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "four"; });
|
||||||
|
_session.Flush();
|
||||||
|
|
||||||
|
var result = _manager.Query<GammaPart, GammaRecord>()
|
||||||
|
.Where(x => x.Frap.EndsWith("e"))
|
||||||
|
.List();
|
||||||
|
|
||||||
|
Assert.That(result.Count(), Is.EqualTo(2));
|
||||||
|
Assert.That(result.Count(x => x.Get<GammaPart>().Record.Frap == "one"), Is.EqualTo(1));
|
||||||
|
Assert.That(result.Count(x => x.Get<GammaPart>().Record.Frap == "three"), Is.EqualTo(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ContainsExtensionShouldBeUsed() {
|
||||||
|
_manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "one"; });
|
||||||
|
_manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "two"; });
|
||||||
|
_manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "three"; });
|
||||||
|
_manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "four"; });
|
||||||
|
_session.Flush();
|
||||||
|
|
||||||
|
var result = _manager.Query<GammaPart, GammaRecord>()
|
||||||
|
.Where(x => x.Frap.Contains("o"))
|
||||||
|
.List();
|
||||||
|
|
||||||
|
Assert.That(result.Count(), Is.EqualTo(3));
|
||||||
|
Assert.That(result.Count(x => x.Get<GammaPart>().Record.Frap == "one"), Is.EqualTo(1));
|
||||||
|
Assert.That(result.Count(x => x.Get<GammaPart>().Record.Frap == "two"), Is.EqualTo(1));
|
||||||
|
Assert.That(result.Count(x => x.Get<GammaPart>().Record.Frap == "four"), Is.EqualTo(1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -55,19 +55,32 @@
|
|||||||
|
|
||||||
.wmd-preview blockquote {
|
.wmd-preview blockquote {
|
||||||
margin: 1em 3em;
|
margin: 1em 3em;
|
||||||
color: #999;
|
color: #333;
|
||||||
border-left: 2px solid #999;
|
border-left: 2px solid #999;
|
||||||
padding-left: 1em;
|
padding-left: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wmd-preview pre, .wmd-preview code {
|
.wmd-preview pre, .wmd-preview code {
|
||||||
margin: 1em 3em;
|
margin: 1em 3em;
|
||||||
color: #999;
|
color: #333;
|
||||||
border-left: 2px solid #999;
|
border-left: 2px solid #999;
|
||||||
padding-left: 1em;
|
padding-left: 1em;
|
||||||
font-family: Courier New;
|
font-family: Courier New;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.wmd-preview pre code {
|
||||||
|
border: none;
|
||||||
|
margin-left: 0px;
|
||||||
|
padding-left: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.wmd-preview p code {
|
||||||
|
border: none;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Grippie */
|
/* Grippie */
|
||||||
|
|
||||||
div.grippie {
|
div.grippie {
|
||||||
|
@@ -132,7 +132,7 @@ namespace Orchard.Tags.Services {
|
|||||||
public IEnumerable<IContent> GetTaggedContentItems(int tagId, int skip, int take, VersionOptions options) {
|
public IEnumerable<IContent> GetTaggedContentItems(int tagId, int skip, int take, VersionOptions options) {
|
||||||
return _orchardServices.ContentManager
|
return _orchardServices.ContentManager
|
||||||
.Query<TagsPart, TagsPartRecord>()
|
.Query<TagsPart, TagsPartRecord>()
|
||||||
.Where(tpr => tpr.Tags.Any(tr => tr.TagRecord.Id == tagId))
|
.WhereAny(part => part.Tags, tag => tag.TagRecord.Id == tagId)
|
||||||
.Join<CommonPartRecord>().OrderByDescending(x => x.CreatedUtc)
|
.Join<CommonPartRecord>().OrderByDescending(x => x.CreatedUtc)
|
||||||
.Slice(skip, take);
|
.Slice(skip, take);
|
||||||
}
|
}
|
||||||
@@ -144,7 +144,7 @@ namespace Orchard.Tags.Services {
|
|||||||
public int GetTaggedContentItemCount(int tagId, VersionOptions options) {
|
public int GetTaggedContentItemCount(int tagId, VersionOptions options) {
|
||||||
return _orchardServices.ContentManager
|
return _orchardServices.ContentManager
|
||||||
.Query<TagsPart, TagsPartRecord>()
|
.Query<TagsPart, TagsPartRecord>()
|
||||||
.Where(tpr => tpr.Tags.Any(tr => tr.TagRecord.Id == tagId))
|
.WhereAny(part => part.Tags, tag => tag.TagRecord.Id == tagId)
|
||||||
.Count();
|
.Count();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -34,6 +34,9 @@ namespace Orchard.ContentManagement {
|
|||||||
private const string Published = "Published";
|
private const string Published = "Published";
|
||||||
private const string Draft = "Draft";
|
private const string Draft = "Draft";
|
||||||
|
|
||||||
|
static DefaultContentManager() {
|
||||||
|
RestrictionExtensions.RegisterExtensions();
|
||||||
|
}
|
||||||
public DefaultContentManager(
|
public DefaultContentManager(
|
||||||
IComponentContext context,
|
IComponentContext context,
|
||||||
IRepository<ContentTypeRecord> contentTypeRepository,
|
IRepository<ContentTypeRecord> contentTypeRepository,
|
||||||
|
@@ -36,7 +36,7 @@ namespace Orchard.ContentManagement {
|
|||||||
return _session;
|
return _session;
|
||||||
}
|
}
|
||||||
|
|
||||||
IQueryOver<ContentItemVersionRecord, TRecord> BindQueryOverByPath<TRecord, TU>(IQueryOver<ContentItemVersionRecord, TU> queryOver, string name) {
|
IQueryOver<ContentItemVersionRecord, TRecord> BindQueryOverByPath<TRecord, TU>(IQueryOver<ContentItemVersionRecord, TU> queryOver, string name, JoinType joinType = JoinType.InnerJoin) {
|
||||||
if (_joins.ContainsKey(typeof(TRecord).Name)) {
|
if (_joins.ContainsKey(typeof(TRecord).Name)) {
|
||||||
return (IQueryOver<ContentItemVersionRecord, TRecord>)_joins[typeof(TRecord).Name];
|
return (IQueryOver<ContentItemVersionRecord, TRecord>)_joins[typeof(TRecord).Name];
|
||||||
}
|
}
|
||||||
@@ -53,7 +53,7 @@ namespace Orchard.ContentManagement {
|
|||||||
Expression.Property(parameter, syntheticProperty),
|
Expression.Property(parameter, syntheticProperty),
|
||||||
parameter);
|
parameter);
|
||||||
|
|
||||||
var join = queryOver.JoinQueryOver(syntheticExpression);
|
var join = queryOver.JoinQueryOver(syntheticExpression, joinType);
|
||||||
_joins[typeof(TRecord).Name] = join;
|
_joins[typeof(TRecord).Name] = join;
|
||||||
|
|
||||||
return join;
|
return join;
|
||||||
@@ -62,13 +62,13 @@ namespace Orchard.ContentManagement {
|
|||||||
IQueryOver<ContentItemVersionRecord, ContentTypeRecord> BindTypeQueryOver() {
|
IQueryOver<ContentItemVersionRecord, ContentTypeRecord> BindTypeQueryOver() {
|
||||||
// ([ContentItemVersionRecord] >join> [ContentItemRecord]) >join> [ContentType]
|
// ([ContentItemVersionRecord] >join> [ContentItemRecord]) >join> [ContentType]
|
||||||
|
|
||||||
return BindQueryOverByPath<ContentTypeRecord, ContentItemRecord>(BindItemQueryOver(), "ContentType");
|
return BindQueryOverByPath<ContentTypeRecord, ContentItemRecord>(BindItemQueryOver(), "ContentType", JoinType.LeftOuterJoin);
|
||||||
}
|
}
|
||||||
|
|
||||||
IQueryOver<ContentItemVersionRecord, ContentItemRecord> BindItemQueryOver() {
|
IQueryOver<ContentItemVersionRecord, ContentItemRecord> BindItemQueryOver() {
|
||||||
// [ContentItemVersionRecord] >join> [ContentItemRecord]
|
// [ContentItemVersionRecord] >join> [ContentItemRecord]
|
||||||
|
|
||||||
return BindQueryOverByPath<ContentItemRecord, ContentItemVersionRecord>(BindItemVersionQueryOver(), "ContentItemRecord");
|
return BindQueryOverByPath<ContentItemRecord, ContentItemVersionRecord>(BindItemVersionQueryOver(), "ContentItemRecord", JoinType.LeftOuterJoin);
|
||||||
}
|
}
|
||||||
|
|
||||||
IQueryOver<ContentItemVersionRecord, ContentItemVersionRecord> BindItemVersionQueryOver() {
|
IQueryOver<ContentItemVersionRecord, ContentItemVersionRecord> BindItemVersionQueryOver() {
|
||||||
@@ -103,7 +103,14 @@ namespace Orchard.ContentManagement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void Where<TRecord>(Expression<Func<TRecord, bool>> predicate) where TRecord : ContentPartRecord {
|
private void Where<TRecord>(Expression<Func<TRecord, bool>> predicate) where TRecord : ContentPartRecord {
|
||||||
BindPartQueryOver<TRecord>().Where(predicate);
|
var processedCriteria = NHibernate.Impl.ExpressionProcessor.ProcessExpression(predicate);
|
||||||
|
BindPartQueryOver<TRecord>().Where(processedCriteria);
|
||||||
|
//BindPartQueryOver<TRecord>().WithSubquery.WhereSome(.Where(predicate);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WhereAny<TRecord, TKey>(Expression<Func<TRecord, IEnumerable<TKey>>> selector, Expression<Func<TKey, bool>> predicate) where TRecord : ContentPartRecord {
|
||||||
|
//var address = BindPartQueryOver<TRecord>() QueryOver.Of<TRecord>().Where(selector);
|
||||||
|
BindPartQueryOver<TRecord>().JoinQueryOver<TKey>(selector).Where(predicate);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OrderBy<TRecord>(Expression<Func<TRecord, object>> keySelector) where TRecord : ContentPartRecord {
|
private void OrderBy<TRecord>(Expression<Func<TRecord, object>> keySelector) where TRecord : ContentPartRecord {
|
||||||
@@ -146,10 +153,12 @@ namespace Orchard.ContentManagement {
|
|||||||
queryOver.Take(count);
|
queryOver.Take(count);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ReadOnlyCollection<ContentItem>(queryOver
|
var result = queryOver
|
||||||
.List<ContentItemVersionRecord>()
|
.List<ContentItemVersionRecord>()
|
||||||
.Select(x => ContentManager.Get(x.Id, VersionOptions.VersionRecord(x.Id)))
|
.Select(x => ContentManager.Get(x.Id, VersionOptions.VersionRecord(x.Id)))
|
||||||
.ToList());
|
.ToList();
|
||||||
|
|
||||||
|
return new ReadOnlyCollection<ContentItem>(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Count() {
|
int Count() {
|
||||||
@@ -254,6 +263,11 @@ namespace Orchard.ContentManagement {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IContentQuery<T, TR> IContentQuery<T, TR>.WhereAny<TKey>(Expression<Func<TR, IEnumerable<TKey>>> selector, Expression<Func<TKey, bool>> predicate) {
|
||||||
|
_query.WhereAny(selector, predicate);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
IContentQuery<T, TR> IContentQuery<T, TR>.OrderBy<TKey>(Expression<Func<TR, TKey>> keySelector) {
|
IContentQuery<T, TR> IContentQuery<T, TR>.OrderBy<TKey>(Expression<Func<TR, TKey>> keySelector) {
|
||||||
_query.OrderBy(keySelector);
|
_query.OrderBy(keySelector);
|
||||||
return this;
|
return this;
|
||||||
|
@@ -1,77 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<ClassDiagram MajorVersion="1" MinorVersion="1" MembersFormat="FullSignature">
|
|
||||||
<Class Name="Orchard.Models.ContentItem">
|
|
||||||
<Position X="0.5" Y="1.25" Width="2.5" />
|
|
||||||
<Members>
|
|
||||||
<Property Name="IContent.ContentItem" Hidden="true" />
|
|
||||||
</Members>
|
|
||||||
<TypeIdentifier>
|
|
||||||
<HashCode>AAACAAAAAAACAAhAABAAAAAAAAAAQABAAAAQAAAEBAA=</HashCode>
|
|
||||||
<FileName>Models\ContentItem.cs</FileName>
|
|
||||||
</TypeIdentifier>
|
|
||||||
<ShowAsAssociation>
|
|
||||||
<Property Name="Record" />
|
|
||||||
</ShowAsAssociation>
|
|
||||||
<ShowAsCollectionAssociation>
|
|
||||||
<Property Name="Parts" />
|
|
||||||
</ShowAsCollectionAssociation>
|
|
||||||
<Lollipop Position="0.2" />
|
|
||||||
</Class>
|
|
||||||
<Class Name="Orchard.Models.ContentPart">
|
|
||||||
<Position X="5.75" Y="2.25" Width="1.5" />
|
|
||||||
<TypeIdentifier>
|
|
||||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAA=</HashCode>
|
|
||||||
<FileName>Models\ContentPart.cs</FileName>
|
|
||||||
</TypeIdentifier>
|
|
||||||
<ShowAsAssociation>
|
|
||||||
<Property Name="ContentItem" />
|
|
||||||
</ShowAsAssociation>
|
|
||||||
<Lollipop Position="0.2" />
|
|
||||||
</Class>
|
|
||||||
<Class Name="Orchard.Models.ContentPart<TRecord>">
|
|
||||||
<Position X="5.25" Y="4" Width="2.5" />
|
|
||||||
<TypeIdentifier>
|
|
||||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAA=</HashCode>
|
|
||||||
<FileName>Models\ContentPart.cs</FileName>
|
|
||||||
</TypeIdentifier>
|
|
||||||
</Class>
|
|
||||||
<Class Name="Orchard.Models.Records.ContentItemRecord">
|
|
||||||
<Position X="0.5" Y="4.75" Width="2.5" />
|
|
||||||
<TypeIdentifier>
|
|
||||||
<HashCode>AAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAA=</HashCode>
|
|
||||||
<FileName>Models\Records\ContentItemRecord.cs</FileName>
|
|
||||||
</TypeIdentifier>
|
|
||||||
<ShowAsAssociation>
|
|
||||||
<Property Name="ContentType" />
|
|
||||||
</ShowAsAssociation>
|
|
||||||
</Class>
|
|
||||||
<Class Name="Orchard.Models.Records.ContentTypeRecord">
|
|
||||||
<Position X="0.5" Y="6.5" Width="2.25" />
|
|
||||||
<TypeIdentifier>
|
|
||||||
<HashCode>AAACAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
|
||||||
<FileName>Models\Records\ContentTypeRecord.cs</FileName>
|
|
||||||
</TypeIdentifier>
|
|
||||||
</Class>
|
|
||||||
<Interface Name="Orchard.Models.IContent">
|
|
||||||
<Position X="5.5" Y="0.5" Width="2.25" />
|
|
||||||
<TypeIdentifier>
|
|
||||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAA=</HashCode>
|
|
||||||
<FileName>Models\IContent.cs</FileName>
|
|
||||||
</TypeIdentifier>
|
|
||||||
</Interface>
|
|
||||||
<Interface Name="Orchard.Models.IContentManager">
|
|
||||||
<Position X="4" Y="5.75" Width="6" />
|
|
||||||
<TypeIdentifier>
|
|
||||||
<HashCode>AAAAEAAAAAAAACBBAIAAAAAAAAEAAEgAAACAAAAAAAA=</HashCode>
|
|
||||||
<FileName>Models\IContentManager.cs</FileName>
|
|
||||||
</TypeIdentifier>
|
|
||||||
</Interface>
|
|
||||||
<Interface Name="Orchard.Models.Driver.IContentHandler">
|
|
||||||
<Position X="4.5" Y="8.75" Width="4.75" />
|
|
||||||
<TypeIdentifier>
|
|
||||||
<HashCode>AAAAEAAAAAEAAABBAIAAAIAAACEAAAQAAACAAAAAAAg=</HashCode>
|
|
||||||
<FileName>Models\Driver\IContentHandler.cs</FileName>
|
|
||||||
</TypeIdentifier>
|
|
||||||
</Interface>
|
|
||||||
<Font Name="Segoe UI" Size="9" />
|
|
||||||
</ClassDiagram>
|
|
@@ -32,6 +32,7 @@ namespace Orchard.ContentManagement {
|
|||||||
new IContentQuery<TPart, TRecord> ForVersion(VersionOptions options);
|
new IContentQuery<TPart, TRecord> ForVersion(VersionOptions options);
|
||||||
|
|
||||||
IContentQuery<TPart, TRecord> Where(Expression<Func<TRecord, bool>> predicate);
|
IContentQuery<TPart, TRecord> Where(Expression<Func<TRecord, bool>> predicate);
|
||||||
|
IContentQuery<TPart, TRecord> WhereAny<TKey>(Expression<Func<TRecord, IEnumerable<TKey>>> selector, Expression<Func<TKey, bool>> predicate);
|
||||||
IContentQuery<TPart, TRecord> OrderBy(Expression<Func<TRecord, object>> keySelector);
|
IContentQuery<TPart, TRecord> OrderBy(Expression<Func<TRecord, object>> keySelector);
|
||||||
IContentQuery<TPart, TRecord> OrderByDescending(Expression<Func<TRecord, object>> keySelector);
|
IContentQuery<TPart, TRecord> OrderByDescending(Expression<Func<TRecord, object>> keySelector);
|
||||||
|
|
||||||
|
41
src/Orchard/ContentManagement/RestrictionExtensions.cs
Normal file
41
src/Orchard/ContentManagement/RestrictionExtensions.cs
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
using System.Text;
|
||||||
|
using NHibernate.Criterion;
|
||||||
|
using NHibernate.Impl;
|
||||||
|
using Orchard.ContentManagement.Records;
|
||||||
|
|
||||||
|
namespace Orchard.ContentManagement {
|
||||||
|
public static class RestrictionExtensions {
|
||||||
|
public static void RegisterExtensions() {
|
||||||
|
ExpressionProcessor.RegisterCustomMethodCall(() => "".StartsWith(""), RestrictionExtensions.ProcessStartsWith);
|
||||||
|
ExpressionProcessor.RegisterCustomMethodCall(() => "".EndsWith(""), RestrictionExtensions.ProcessEndsWith);
|
||||||
|
ExpressionProcessor.RegisterCustomMethodCall(() => "".Contains(""), RestrictionExtensions.ProcessContains);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ICriterion ProcessStartsWith(MethodCallExpression methodCallExpression) {
|
||||||
|
ExpressionProcessor.ProjectionInfo projection = ExpressionProcessor.FindMemberProjection(methodCallExpression.Object);
|
||||||
|
string value = (string)ExpressionProcessor.FindValue(methodCallExpression.Arguments[0]);
|
||||||
|
MatchMode matchMode = MatchMode.Start;
|
||||||
|
return projection.Create<ICriterion>(s => Restrictions.InsensitiveLike(s, value, matchMode), p => Restrictions.InsensitiveLike(p, value, matchMode));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static ICriterion ProcessEndsWith(MethodCallExpression methodCallExpression) {
|
||||||
|
ExpressionProcessor.ProjectionInfo projection = ExpressionProcessor.FindMemberProjection(methodCallExpression.Object);
|
||||||
|
string value = (string)ExpressionProcessor.FindValue(methodCallExpression.Arguments[0]);
|
||||||
|
MatchMode matchMode = MatchMode.End;
|
||||||
|
return projection.Create<ICriterion>(s => Restrictions.InsensitiveLike(s, value, matchMode), p => Restrictions.InsensitiveLike(p, value, matchMode));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static ICriterion ProcessContains(MethodCallExpression methodCallExpression) {
|
||||||
|
ExpressionProcessor.ProjectionInfo projection = ExpressionProcessor.FindMemberProjection(methodCallExpression.Object);
|
||||||
|
string value = (string)ExpressionProcessor.FindValue(methodCallExpression.Arguments[0]);
|
||||||
|
MatchMode matchMode = MatchMode.Anywhere;
|
||||||
|
return projection.Create<ICriterion>(s => Restrictions.InsensitiveLike(s, value, matchMode), p => Restrictions.InsensitiveLike(p, value, matchMode));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -23,7 +23,7 @@ namespace Orchard.Data.Conventions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void Apply(IOneToManyCollectionInstance instance) {
|
public void Apply(IOneToManyCollectionInstance instance) {
|
||||||
instance.Fetch.Join();
|
instance.Fetch.Select();
|
||||||
instance.Cache.ReadWrite();
|
instance.Cache.ReadWrite();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -171,6 +171,7 @@
|
|||||||
<Compile Include="ContentManagement\ImportContentSession.cs" />
|
<Compile Include="ContentManagement\ImportContentSession.cs" />
|
||||||
<Compile Include="ContentManagement\MetaData\Services\ISettingsFormatter.cs" />
|
<Compile Include="ContentManagement\MetaData\Services\ISettingsFormatter.cs" />
|
||||||
<Compile Include="ContentManagement\QueryHints.cs" />
|
<Compile Include="ContentManagement\QueryHints.cs" />
|
||||||
|
<Compile Include="ContentManagement\RestrictionExtensions.cs" />
|
||||||
<Compile Include="ContentManagement\Utilities\ComputedField.cs" />
|
<Compile Include="ContentManagement\Utilities\ComputedField.cs" />
|
||||||
<Compile Include="Data\Conventions\AggregateAttribute.cs" />
|
<Compile Include="Data\Conventions\AggregateAttribute.cs" />
|
||||||
<Compile Include="Data\Conventions\CacheConvention.cs" />
|
<Compile Include="Data\Conventions\CacheConvention.cs" />
|
||||||
@@ -906,7 +907,6 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="app.config" />
|
<None Include="app.config" />
|
||||||
<None Include="ContentManagement\Diagram.cd" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
|
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
|
||||||
|
Reference in New Issue
Block a user