SubSonic 3 Linq加入问题

时间:2009-08-25 01:19:14

标签: linq subsonic subsonic3

使用linqtemplates,我尝试将linq语法接近docs

中的内容
        var query = from c in db.CountyLookups
                    join s in db.StateLookUps on
                    c.StateLookupID equals
                    s.StateLookupID
                    where c.Name2 == countyName &&
                    s.Abbr == stateAbbr
                    select new
                    {
                        Latitude = c.Latitude,
                        Longitude = c.Longitude
                    };

        var result = query.SingleOrDefault();

但是当调用.SingleOrDefault()时,我会看到一个黄色的虚拟屏幕,上面写着:

  

System.NotSupportedException:不支持成员'StateLookupID'

堆栈跟踪结束于:

SubSonic.Linq.Structure.TSqlFormatter.VisitMemberAccess(MemberExpression m) 

StateLookupID列在数据库中有下划线,是一个常规的int pk / fk。

我做错了什么?

4 个答案:

答案 0 :(得分:2)

显然,VisitMemberAccess不知道如何处理int,只有字符串和日期时间(从SubSonic.Linq.Structure.TSqlFormatter的第152行开始)。我不知道为什么会在连接上调用它,因为连接通常在int pk / fk(或guid,如果你愿意)之间。

我最终取消了linq查询,转而使用SubSonic.Query.Select。这是我的新代码:

        var query = db.Select.From<CountyLookup>()
            .InnerJoin<StateLookUp>()
            .Where(CountyLookupTable.Name2Column)
            .IsEqualTo(countyName)
            .And(StateLookUpTable.AbbrColumn)
            .IsEqualTo(stateAbbr);

然后我调用ExecuteTypedList并将结果映射回我的模型类。像buttah一样工作。只想在这种情况下使用linq。

答案 1 :(得分:0)

当我向我的模型添加属性时,我得到了这个错误(ASP.Net MVC 1.0中提到的IsValid属性,感谢Rob)。 我已经开启和关闭了这个问题,我想我已经把它钉在了查询构建器上,试图构建一个应该在代码中完成的查询,而不是TSQL。

当它尝试生成SQL时,它会沿着路径下行以通过复杂类型(可能是另一个模型)上的VisitMemberAccess生成TSQL,但它只知道如何在VisitMemberAccess中对日期时间和字符串执行操作。如果这有点不连贯,我很抱歉,但我正试图了解它。

为了解决这个问题,请考虑在执行TSQL生成的任何操作之前使用LinqKit AsExpandable之类的东西。我在一个简单的OrderBy上尝试了这个,它正在发挥作用,它似乎有效,但我不知道它将对性能做些什么。

答案 2 :(得分:0)

实际上我把它拿回来我通过

克服了我的问题

Stuff.All()。Where(x =&gt; x.Someid == id)。ToArray()            .AsQueryable()            .Where(x =&gt; x.SomeProp.SomeFlag == true);

这很糟糕,但它确实有效。

答案 3 :(得分:0)

这仍然是一个问题;即在简单的情况下,例如:

var list = from lang in db.Languages
                       join site in db.SiteConfigLanguages on
                       lang.Code equals site.LanguageCode
                       select lang;

这应该评估为简单的SQL(尽管在这个例子中没有意义):

SELECT Language.* FROM Language LEFT JOIN SiteConfigLanguage ON Language.Code = SiteConfigLanguage.LanguageCode;

它在同一个VisitMemberAccess函数中失败,因为(在这种情况下)语言不是可识别的声明类型(即String或DateTime)。它与上面提供的@matware描述非常相似,但听起来好像“IsValid”成员是纯C#代码,而在这种情况下,lang.Code只是对数据库中列的引用。

我正在研究解决方法,因为这只是较大的LINQ查询的一部分,这对我来说是失败的;如果我找到任何东西,我会在这里发布。否则,已知此问题的任何其他解决方案/解决方法?

更新:在此忽略我;这只是因为我在LINQ语句中缺少一个简单的行;你需要确保使用“into”关键字来完成任务!

    var list = from lang in db.Languages
               join site in db.SiteConfigLanguages on
               lang.Code equals site.LanguageCode into sl
               from siteLang in sl.DefaultIfEmpty()
               select lang;

我有另一个错误提醒你,但至少这个特殊的例外已经解决了。不幸的是,下一个看起来有点麻烦(在System.Linq库中)。