没有显式外键关系的Linq To SQL
-
03-07-2019 - |
题
我正在使用一些具有关系的遗留表,但这些关系尚未明确设置为主键/外键。我使用“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 不能作为案例的成员。
我从同事那里听说我可能会尝试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在我所在的地方不存在 假设如果有的话 显式主/外键 关系。
“不可用”是什么意思?如果您按照自己的意愿在设计器中创建了关联,那么查询应该生成类似于
的SQLSELECT [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"