我正在使用一些具有关系的遗留表,但这些关系尚未明确设置为主键/外键。我使用“Linq To Sql Classes”创建了一个.dbml文件,并建立了正确的Case.CaseID = CaseInfo.CaseID关联。我得到的类是CasesDataContext。
我的桌子(一对多):
Case
------------------
CaseID (int not null)
MetaColumn1 (varchar)
MetaColumn2 (varchar)
MetaColumn3 (varchar)
...
CaseInfo
------------------
CaseInfoID (int)
CaseID (int nulls allowed)
CaseInfoMeta (varchar)
...
我是LinqToSQL的新手,我很难做到......
CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
where c.CaseInfo.CaseInfoMeta == "some value"
select c;
(编辑)我的问题是CaseInfo或CaseInfos不能作为Cases的成员。
我从一位同事那里听说我可能会尝试ADO.Net实体数据模型来创建我的数据上下文类,但还没有尝试过,想看看我是在浪费时间还是应该走另一条路。任何提示,链接,帮助将非常感激。
CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
join ci in db.CaseInfo on
ci.ID equals c.InfoID
where ci.CaseInfoMeta == "some value"
select new {CASE=c, INFO=ci};
我的“加入”linq有点生疏,但上面应该接近你所追求的。
协会是一对一还是一对多?如果您将关联设置为One to Many,那么您拥有的是EntitySet,而不是EntityRef,您需要在依赖集上使用where子句来获取正确的值。我怀疑你想要一对一的关系,这不是默认的关系。尝试将其更改为一对一,看看是否可以构建查询。
注意:我只是猜测,因为你实际上没有告诉我们实际上是什么“麻烦”。
您的查询看起来正确,应该返回Case对象的查询结果集。
所以有什么问题?
(编辑)我的问题是CaseInfo在案例下不可用...即c.CaseInfo不存在,我假设如果有明确的主/外键关系。
“不可用”是什么意思?如果您按照自己的意愿在设计器中创建了关联,那么查询应该生成SQL的内容
SELECT [columns]
FROM Case INNER JOIN CaseInfo
ON Case.CaseID = CaseInfo.CaseID
WHERE CaseInfo.CaseInfoMeta = 'some value'
您是否调试了linq查询以获取生成的SQL?它返回了什么?
您可能想要尝试的几件事:
检查关联的属性。确保将Parent属性创建为Public。它默认情况下会这样做,但可能会有所改变。
由于你没有在C上获得CaseInfo,尝试在另一个方向键入它以查看你是否获得了带有intellisense的ci.Case。
一起删除并重新创建关联。
如果孩子们没有出现,就会出现一些非常基本的错误。最好删除dbml并重新创建整个内容。
如果所有其他方法都失败了,请切换到NHibernate。 :)
经过几次测试后,我非常确定数据库中是否需要FK关系,无论在Linq-to-SQL中创建了什么关联。即如果您没有在数据库中明确设置它们,则必须手动进行连接。
这是c#?我认为你需要==
而不是=这一行:
where c.CaseInfo.CaseInfoMeta = "some value"
应该读
where c.CaseInfo.CaseInfoMeta == "some value"