【发布时间】:2011-12-11 20:03:51
【问题描述】:
我有一个 LINQ to SQL 类,我们将其命名为 Test,我希望能够使用 LINQ 查询访问属性,但我得到了著名的“不支持 SQL 转换”运行时错误。我对概念问题感兴趣。这是我的简化课程:
public class Test
{
public int ID {get; set;} // Stored in Database
public int NonForeignKeyValue {get; set;} // Stored in Database
}
这是我想要完成的一个示例,但我不希望总是在 LINQ 中显式编写连接的开销:
var db = (new DataContext()).GetTable<Test>();
var q = (from t in db.GetTable<Test>()
join o in db.GetTable<OtherTable>() on o.ID equals t.ID
where t.OtherStuff
select t)
我希望能够向Test 添加一个属性,告诉我OtherTable 中是否有可以与Test 连接的行:
public bool IsInOtherTable
{
get
{
return (new DataContext())
.GetTable<OtherTabke>()
.Any(x => x.NonForeignKeyValue == this.NonForeignKeyValue));
}
}
最终这就是我希望我的代码看起来的样子,但它出错了。我基本上想返回所有包含一些数据库计算值的条目:
using (DataContext db = new DataContext())
{
var q = db.GetTable<Test>()
.Where(x => x.IsInOtherTable && x.OtherStuff); //Error
}
每次我想检查 Test 是否在另一个表中具有某些信息时,我基本上都在尝试避免编写此代码。我对我描述的确切问题不感兴趣,我更感兴趣的是如何在概念上将连接部分添加到 SQL 并仍然使用 LINQ。我猜我使用的是 Linq.Expression,但我真的不知道,也不知道该怎么做。
顺便说一句,我可以只编写实际的 SQL,因为它并不复杂,但我想知道如何解决这个问题并仍然使用 LINQ。
编辑:我试过这个属性,但我得到了同样的错误。只是将返回类型更改为表达式更复杂...
public System.Linq.Expressions.Expression<Func<Article3, bool>> Exists
{
get
{
using (DataContext db = new DataContext())
{
return i => db.GetTable<OtherTable>()
.Any(x => x.NonForeignKeyValue == i.NonForeignKeyValue));
}
}
}
【问题讨论】:
-
对于初学者,您要一起使用的所有查询都必须使用相同的数据上下文
-
嵌套 using(...) 块是否折叠成一个 using(...) 块?它是如何工作的?
标签: c# linq linq-to-sql