Комплексное соединение SimpleData и проекция на тип poco - PullRequest
3 голосов
/ 06 сентября 2011

Я начинаю использовать Simple.Data более серьезно, и у меня есть следующий сценарий, который, кажется, не работает, и я не могу обернуться, почему бы и нет (возможно, что-то глупое, поскольку я смотрелв течение нескольких часов).

В основном структура базы данных:

Activity <-> Activity_Join <-> Location

(Отношение ко многим ко многим использует таблицу соединений,деятельность и местоположение должны быть довольно простыми. Скажем, пейнтбольная деятельность может быть как в Бристоле, так и в Бате и т. д. Поездка - это, в основном, версия (мужская / женская / и т. д.) для контента / стиля.)

Simple.Data query:

return _database.Activity.Query()
.Join(_database.Activity_Join).On(_database.Activity.ID_Activity == _database.Activity_Join.ID_Activity)
.Join(_database.Location).On(_database.Activity_Join.ID_Location == _database.Location.ID_Location)
.Where(_database.Activity.ID_trip == idTrip && 
    _database.Activity.Activity_Time == 'D' && 
    _database.Activity.Is_Public == true)
.Select(
    _database.Activity.ID_Activity
    , _database.Location.ID_Location
    , _database.Activity.ID_Trip
    , _database.Activity.Activity_Name
    , _database.Activity.Adrenaline_Factor
    , _database.Activity.Relaxation_Factor
    , _database.Activity.Fun_Factor
    , _database.Activity.Activity_Description
    , _database.Activity.Activity_Extra_Info
    , _database.Activity.Activity_Time
    , _database.Activity.Activity_Price
    , _database.Activity.Activity_Duration
    , _database.Activity.Activity_Image
    , _database.Activity.Is_Public).Cast<Activity>();

POCO:

using System;

namespace Blah.Models.POCOs
{
    public class Activity
    {
        public Guid ID_Activity { get; set; }
        public Guid ID_Location { get; set; }
        public Guid ID_Trip { get; set; }
        public string Activity_Name { get; set; }
        public int Adrenaline_Factor { get; set; }
        public int Relaxation_Factor { get; set; }
        public int Fun_Factor { get; set; }
        public string Activity_Description { get; set; }
        public string Activity_Extra_Info { get; set; }
        public string Activity_Time { get; set; }
        public decimal Activity_Price { get; set; }
        public string Activity_Duration { get; set; }
        public string Activity_Image { get; set; }
        public bool Is_Public { get; set; }
    }
}

Целью запроса является получение Activity за поездку и тег в гиде ID_Location, чтобы иметь возможность выяснитьгде происходит деятельностьДалее в моем коде я держу список мест в памяти, поэтому буду использовать LINQ, а не DB по нескольким другим причинам.

Проблема в том, что он не приведен к POCO!Ошибка и трассировка стека:

Object reference not set to an instance of an object.

   at Simple.Data.Ado.Joiner.<GetJoinClauses>d__a.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__71`1.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__71`1.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__71`1.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__71`1.MoveNext()
   at System.Linq.Enumerable.<DistinctIterator>d__81`1.MoveNext()
   at System.String.Join(String separator, IEnumerable`1 values)
   at Simple.Data.Ado.QueryBuilder.HandleJoins()
   at Simple.Data.Ado.QueryBuilder.Build(SimpleQuery query, IEnumerable`1& unhandledClauses)
   at Simple.Data.Ado.AdoAdapter.RunQuery(SimpleQuery query, IEnumerable`1& unhandledClauses)
   at Simple.Data.SimpleQuery.Run()
   at Simple.Data.SimpleQuery.Cast[T]()
   at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
   at blahh.Models.Site.SitemapGenerator.GetDayActivitiesPerTrip(Guid idTrip) in D:\Projects\blah\blahh\Models\Site\SitemapGenerator.cs:line 39
   at blahh.Models.Site.SitemapGenerator.Generate() in D:\Projects\blah\blahh\Models\Site\SitemapGenerator.cs:line 80
   at blahh.Controllers.AdminController.Generate_Sitemap() in D:\Projects\blah\blahh\Controllers\AdminController.cs:line 1360
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)

1 Ответ

2 голосов
/ 07 сентября 2011

Я только что добавил тест в комплект Simple.Data, который делает (в терминах объединения) именно то, что вы там делаете, и, к сожалению (в целях ответа на ваш вопрос), он проходит.

Используете ли вы последнюю версию? Я недавно нажал 0.9.5 для NuGet, так что, возможно, обновление до этого поможет? В противном случае мы могли бы передать это в группу Google, и я помогу вам решить ее.

...