我有一个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));
       }
    }
}        

===============>>#1 票数:1

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

在你的例子中,你不是传递表达式而是 - 属性,委托,即表达式访问者无法“进入”的东西。

在一般情况下,尝试重新考虑你的条件,使代替bool你有Expression<T, bool>等。

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

===============>>#2 票数:0 已采纳

首先,我认为你可能会高估“始终在LINQ中明确编写连接的开销”。 这是一个额外的代码行,它具有相对自我记录的优势,就像你正在做的事情一样(总是一件好事),而任何其他方法都将首先转变为SQL,然后转变为一个查询计划。至少执行成本高,可能更昂贵(SQLServer是一个很好的连接!)

尽管如此,我还能想到两种选择。

一种是在类上有一个EntityRef属性,用于定义与另一个表的这种关系。 然后,您可以测试查询中是否为null(如果它位于一对多关系的另一侧,则为EntitySet )。

另一种是定义一个SQL函数,该函数返回一个bit结果,指示id是否引用与另一个表相关或不相关的行。

然后在DataContext派生类上定义一个与C#术语中的签名匹配的受保护方法,并将Function属性映射到该SQL函数。 (因为这不是你可以在C#版本中提供合理的非db-using版本的东西,你可以通过调用ExecuteMethodCall来实现C#函数)。

然后,您可以使用该方法而不是连接。

尽管如此,这在代码中可能不太明显,并且存在效率低于仅仅保持连接的风险。

  ask by Mark translate from so

未解决问题?本站智能推荐:

2回复

使用count将SQL转换为linq表达式

我试图将以下SQL转换为LINQ表达式 我一直试图关注这个网页作为例子: 将包含top,count,group和order的SQL转换为LINQ(2个实体) 到目前为止,我得到了这个,但我仍然坚持理解新的部分 在此先感谢您的帮助 更新: 你能解释一下g.Key
1回复

SQL-将查询转换为linq,sql和lambda表达式

我有一个sql(获取具有最新日期的所有不同的MID),我想将其转换为linq查询和lambda表达式 我有这个lambda,但我不知道如何获取MID字段 请建议如何修复linq查询和lambda的语法。 谢谢
3回复

Linq“无法将表达式转换为SQL,无法将其视为本地表达式。”

我从这个问题开始,我在那里回答,现在我在这里问更基本的问题。 我已将查询简化为: tel.FormattedNumber是一个将Number和Extension字段组合成一个整齐格式的字符串的属性。 这是导致的错误: 如果我将上面的引用从FormattedNumber更改为纯
6回复

我们可以将所有SQL脚本转换为Linq-to-SQL表达式,还是有任何限制?

我想将我的所有db存储过程转换为linq到sql表达式,这项工作是否有任何限制? 你必须注意到我的数据库中有一些复杂的查询。
1回复

通过属性表达式构建LINQ to SQL组

我正在尝试动态使用GroupBy,我知道这对LINQ to SQL来说是一个很大的禁忌,但是我认为这可能可行。 我只需要表达语法方面的帮助。 举个简单的例子: 我希望能够按名字或姓氏分组,具体取决于用户的偏好。 现在,我了解到LINQ必须在此处构建SQL兼容表达式,但是我只想交
1回复

LINQ to SQL:属性的可重用表达式?

请原谅我说不出确切的标题。 基本上,我有三个链接到表的LINQ对象。 一个是产品,另一个是公司,最后一个是映射表Mapping,用于存储公司销售哪些产品以及该公司通过哪个ID引用此产品。 我现在正在检索产品列表,如下所示: 这将执行单个查询以检索我想要的信息。 但是我希望
1回复

SQL查询到LINQ表达式

如何将此SQL查询转换为LINQ表达式? 我试过了,但是没用
1回复

创建一个通过名称访问属性的LINQ to SQL兼容表达式

我想知道你们中是否有人对如何解决这个问题有想法。 假设有以下课程 我想创建一个可以传递到LINQ的表达Where方法在LINQ的Where在LINQ方法SQL,如下列: 真正的问题是,我不知道要在运行时检查哪个字段。 该属性的名称以字符串形式提供(在本例中为“ Descr
1回复

无法将表达式转换为sql

使用下面的代码我得到这个错误 InvalidOperationException : 无法将表达式stok_getmiktar_byyapilanislem(urunler.ID, "SATIS")转换为SQL,并且无法将其视为本地表达式。 下面是stok_getmik
3回复

如何将SQL转换为Lambda表达式

在数据库中,我创建了如下表结构。 现在我的问题是我需要检索从某个老师那里学习到的学生数据,这意味着需要检索一些从他/她那里学习到的老师的学生。 完成我的要求。 我写这个SQL查询。 现在,我需要将此查询转换为lambda表达式或Linq。 我该怎么做? 请帮我。 有任何