Linq 2实体:在具有不同类型的两列上执行连接

时间:2009-08-07 17:02:47

标签: .net linq entity-framework entity

我目前正在使用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()'方法

直到现在,我无法找到解决方法。

请求任何帮助。

4 个答案:

答案 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视图以及您需要的其他字段。或者,您可以保留现有实体,只需使用intstring 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 });