使用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。
我做错了什么?
答案 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库中)。