我目前正在使用Entity框架,我想在两列上执行带有连接的Linq查询,一列是'String'类型,另一列是'Int32'类型。
Somethign类似于
from FirstEntity obj in context.FirstEntity
join SecondEntity obj2 in context.SecondEntity on obj.SecondEntityId equals obj2.Id.ToString()
将obj.SecondEntityId作为String,将obj2.Id作为Int32
不幸的是,EF看不到ToString操作。我遇到这个错误(或者一些类似的错误,如果我想将字符串转换为Int32):
LINQ to Entities无法识别方法'System.String ToString()'方法
直到现在,我无法找到解决方法。请求任何帮助。
答案 0 :(得分:2)
我们通常会将这样的内容分解为2个查询(在linq中缺少ToString()实体支持会让我想要伤害小孩子。)
var query1 = (from SecondEntity obj2 in context.SecondEntity
select obj2.ID).ToList();
// now we're using linq to objects which does support ToString()
query1 = query1.Select(x => x.ToString());
// mixing linq to entities and linq to objects
var query2 = from FirstEntity obj in context.FirstEneity
join SecondEntity obj2 in query1 on obj.SecondEntityId equals obj2.ID
我在没有VS的情况下这样做,所以一些语法可能是错误的,这不是一个特别好的解决方案,但EF 是 V1。
答案 1 :(得分:0)
在LINQ to SQL中,您可以使用Convert.ToString(obj2.Id)
,但似乎EF不支持(请参阅this thread on MSDN)。但是,您可以使用Model Defined Function。
更新:由于EF解决方案似乎不起作用,我只想创建一个转换了int
字段的SQL视图以及您需要的其他字段。或者,您可以保留现有实体,只需使用int
和string
ID加入两列视图。查询优化器应该能够弄清楚你正在做什么才能使性能影响微不足道。
答案 2 :(得分:0)
最后,我根据表创建了一个视图,在DB端有一个包含转换后的字符串的新int字段。然后我将我的EF实体映射到视图。它有效:)
很遗憾,我没有在EF方面找到合适的解决方案。希望4.0版本能够解决这类问题。
无论如何,这是你的帮助。
答案 3 :(得分:0)
如果使用函数C#语法而不是特殊的Linq语法,它会有帮助吗?
var results = FirstEntity.Join(SecondEntity,
obj => obj.SecondEntityId, obj2 => obj2.Id.ToString(),
(obj, obj2) => new { First = obj, Second = obj2 });