我正在使用LINQ to SQL类,并扩展了一个(带有部分类)并添加了一个额外的属性。我想查询这个属性,所以:
(from p in db.TableName where p.CustomProperty=="value" select p)
然而,这不起作用。我收到错误:The member 'TableName.CustomProperty' has no supported translation to SQL
。目前我的自定义属性的“设置”部分中没有代码,因为我不确定如何。
基本上,可以用LINQ to SQL查询的Custom属性如何?
作为后续跟进:此CustomProperty不是表格中的列。它是一个单独的值,但我需要获取它(很简单),但也需要查询它!
答案 0 :(得分:2)
正如您所理解的那样,没有任何魔力,所以基本上会有两个查询:第一个是带有数据库条件的SQL查询,其结果应该将您的自定义条件应用为第二个查询。 / p>
因此,您可以使用的解决方法是明确地分割两个部分:
var dbFetch = (from p in db.TableName where p.RealProperty ==" value" select p).ToArray();
var result = from p in dbFetch where p.CustomProperty == "value" select p;
但当然你会遇到一些限制。例如,如果您逐页提取结果,则第二个标准将中断分页,因为它会执行其他过滤。
HTH
答案 1 :(得分:1)
它被称为LINQ to SQL。只是为了避免误解。
关于您的问题:您是否使用设计师添加了该属性?那之后你重新创建了数据库吗?
如果您手动完成,请确保您有一个私有存储字段(如_CustomProperty),并且您的属性(CustomProperty)标有ColumnAttribute,例如
private string _CustomProperty;
[Column(Storage="_CustomProperty", CanBeNull=true)]
public string CustomProperty
{
get { return _CustomProperty; }
}
希望这有帮助。
答案 2 :(得分:0)
你不是错过了那里的平等标志吗?在C#中,相等用双等号表示,如“a == b
”,而单等号表示赋值,如“obj.SomeProp = 5;
”
答案 3 :(得分:0)
我已经实现了一个系统,您可以在其中查询手动添加的属性,这些属性表示来自数据库列的整数属性的枚举包装。所以我知道这是可能的,看起来你可能想要做类似的事情。我这样做的方式并不容易,除非你构建一个你想在很多情况下正确使用的框架,否则最好使用archimed7592建议的解决方案。我目前没有方便的代码所以我无法提供所有细节,但简单地说我的解决方案就像这样。我创建了一个自定义LINQ提供程序,取代了LINQ-to-SQL提供程序。我这样做是通过实现一个自定义IQueryable接口来返回我的LINQ提供程序而不是LINQ-to-SQL提供的接口。然后,在获取表达式对象的函数中,我在返回结果之前预处理了表达式。我将整数属性和整数值之间的比较替换为枚举类型属性和枚举值之间的所有比较,然后将该表达式传递给正常的LINQ-to-SQL实现以返回结果。由于表达式是只读的,我必须创建一个(递归)函数,重新构建整个表达式,替换自定义部分。