Проблема с использованием OrderBy с инфраструктурой сущностей и ObjectContext.CreateQuery(T)

У меня проблемы с использованием этого метода:

public ObjectQuery<E> DoQuery(string columnName, int maximumRows, int startRowIndex)
{
    var result = (ObjectQuery<E>)_ctx.CreateQuery<E>
    ("[" + typeof(E).Name + "]").OrderBy(/*???*/).Skip<E>(startRowIndex).Take(maximumRows);

    return result;
}

Я не уверен, что нужно указать в разделе OrderBy. Я пытался пропустить .OrderBy, но в итоге выдает ошибку, говорящую о том, что его нужно упорядочить, чтобы я мог взять определенное количество строк.

Я хочу заказать по полю ID. В одном случае у меня есть имя объекта как Row, идентификатор этого объекта называется RowID.

Кто-нибудь знает, как я могу заказать по полю ID?

Примечание. Это общий репозиторий, использующий инфраструктуру сущностей. Переданный столбец — это столбец, по которому я хотел бы упорядочить, но, вероятно, это будет только имя поля идентификатора.


person Matt    schedule 07.11.2009    source источник


Ответы (2)


Вы просто делаете:

.OrderBy("it.Id")

... предполагая, что ваше поле идентификатора называется "Id". В построителе запросов «это» означает сущность. Для справки см. эту страницу.

person Craig Stuntz    schedule 09.11.2009

Когда я создавал свой репозиторий, я предполагал, что каждый EntityObject имеет свойство ID. Затем я создал репозиторий:

public class Repository<T> : IRepository<T> where T : EntityObject, IBasicEntityInfo

IBasicEntityInfo:

public interface IBasicEntityInfo
{
    int ID { get; set; }
}

а потом

OrderBy(a => a.ID)

Автоматически сгенерированные классы EntityObject не реализуют интерфейс IBasicEntityInfo, но я использую T4 для генерации:

public partial class User : IBasicEntityInfo ,ILastModificationInfo
public partial class Project : IBasicEntityInfo ,ILastModificationInfo
public partial class Group : IBasicEntityInfo ,ILastModificationInfo
public partial class GroupUser : IBasicEntityInfo 
public partial class OperationSystem : IBasicEntityInfo ,ILastModificationInfo

Т4 прост:

<#@ template language="C#" #>
<#@ output extension="cs" #>
<#@ import namespace="System.Collections.Generic" #>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Web;

<# 
    String[] classNames = new String[] {"User","Project","Group","GroupUser","OperationSystem","TaskType","Priority","Severity","Status","Version","Platform","Task","TaskUser","Attachment","Comment","Setting"}; 
#>
namespace CamelTrap.Models
{
<# foreach(String className in classNames) { #>
    public partial class <#= className #> : IBasicEntityInfo
    {   
    }
<# } #>
}

Такие допущения решили и другие проблемы и избавили меня от создания сложных выражений.

person LukLed    schedule 07.11.2009
comment
Это полезно во многих отношениях (мы делаем почти одно и то же), но на самом деле не помогает решить проблему, с которой он столкнулся. - person Craig Stuntz; 09.11.2009
comment
Это решает проблему, потому что вы можете использовать OrderBy(a => a.ID). Мой репозиторий знает, что каждый объект имеет свойство ID, реализуя IBasicEntityInfo. - person LukLed; 09.11.2009
comment
На том уровне, на котором он находится, он не знает конкретного типа E. Так что OrderBy в вашем комментарии не сработает. Он также не может надежно преобразовать E в IBasicEntityInfo, если только у него нет ограничения на E, что имеет свои недостатки. - person Craig Stuntz; 09.11.2009