SimpleData 复杂连接和投影到 poco 类型

发布于 2024-12-03 00:24:08 字数 4296 浏览 4 评论 0原文

我开始更认真地使用 Simple.Data ,并且有以下场景似乎不起作用,我无法理解为什么不这样做(可能是一些愚蠢的事情,因为我一直盯着它几个小时)。

基本上数据库结构:

Activity <-> Activity_Join <->位置

(使用连接表的多对多关系,活动和位置应该非常简单。假设彩弹射击活动可以在布里斯托尔、巴斯等地进行。旅行基本上是一个版本控制的事情(男性/女性/等) )用于内容/样式。)

简单数据查询:

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; }
    }
}

查询的目的是获取每次行程的活动并在 ID_Location guid 上进行标记,以便能够找出活动发生的位置。在我的代码中,我保存了内存中的位置列表,因此出于其他一些原因将使用 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)

I'm starting to use Simple.Data a bit more seriously and have the following scenario that doesn't seem to be working and I can't wrap my head around why not (probably something silly as I've been staring at it for a few hours).

Basically db structure:

Activity <-> Activity_Join <-> Location

(A many to many relationshop using a join table, an activity and location should be pretty straightforward. Say a paintballing activity could be at both Bristol, Bath and so on. Trip is basically a version'ing thing (male/female/etc) for content/styling.)

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; }
    }
}

The aim of the query is to fetch the Activity per Trip and tag on the ID_Location guid to be able to figure out where the activity takes place. Further on in my code I hold the list of locations in memory so will use LINQ rather than DB for a few other reasons.

The problem is it won't cast to the POCO! The error and stack trace is:

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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

捎一片雪花 2024-12-10 00:24:08

我刚刚向 Simple.Data 套件添加了一个测试,该测试(以连接术语来说)正是您在那里所做的事情,不幸的是(为了回答您的问题),它通过了。

您使用的是最新版本吗?我最近将 0.9.5 推送到 NuGet,所以也许更新到会有帮助?如果做不到这一点,我们可以将此问题移交给 Google 网上论坛,我会帮助您解决。

I just added a test to the Simple.Data suite which does (in join terms) exactly what you're doing there, and unfortunately (for the purposes of answering your question), it passes.

Are you using the latest version? I've recently pushed 0.9.5 to NuGet, so maybe updating to that will help? Failing that, we could take this over to the Google Group and I'll help you resolve it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文