gpt4 book ai didi

c# - 可转换为 SQL 的 Linq to SQL 表达式属性

转载 作者:行者123 更新时间:2023-11-30 18:02:00 26 4
gpt4 key购买 nike

我有一个 LINQ to SQL 类,我们称它为 Test,我希望能够使用 LINQ 查询访问属性,但我得到了著名的“No Supported Translation to SQL”运行时错误。我对概念问题很感兴趣。这是我的简化类(class):

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));
}
}
}

最佳答案

每次 linq 生成器要将代码转换为查询时,它都必须处理表达式树。

在您的示例中,您不是在传递表达式,而是传递属性、委托(delegate),即表达式访问者无法“介入”的内容。

一般来说,尝试重新考虑您的条件,而不是 bool你有Expression<T, bool>等等

http://netpl.blogspot.com/2008/02/linq-to-object-vs-linq-to-sql-and.html

关于c# - 可转换为 SQL 的 Linq to SQL 表达式属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8467032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com