我有一个LINQ to SQL类,我们称之为Test
,我希望能够使用LINQ查询访问属性,但我得到了着名的“No Supported Translation to 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。
编辑:我尝试了这个属性,但我得到了同样的错误。 将返回类型更改为Expression更复杂
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));
}
}
}