4

我目前正在使用实体框架,我想在两列上执行一个带有连接的 Linq 查询,一个是“String”类型,另一个是“Int32”类型。

类似于

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

4 回答 4

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 的情况下执行此操作,因此某些语法可能是错误的,这不是一个特别好的解决方案,但 EFV1。

于 2009-08-10T05:09:18.093 回答
0

最后,我根据表创建了一个视图,在 DB 端有一个新的 int 字段保存转换后的字符串。然后我将我的 EF 实体映射到视图。有用 :)

遗憾的是我没有在 EF 方面找到合适的解决方案。希望4.0版本能解决这类问题。

无论如何,谢谢你的帮助。

于 2009-08-11T09:12:49.487 回答
0

如果您使用函数式 C# 语法而不是特殊的 Linq 语法,它会有所帮助吗?

var results = FirstEntity.Join(SecondEntity, 
     obj => obj.SecondEntityId, obj2 => obj2.Id.ToString(), 
    (obj, obj2) => new { First = obj, Second = obj2 });
于 2009-08-11T20:36:24.727 回答
0

在 LINQ to SQL 中,您可以使用Convert.ToString(obj2.Id),但似乎 EF 不支持(请参阅MSDN 上的此线程)。但是,您也许可以使用模型定义函数

更新:由于 EF 解决方案似乎不起作用,我将创建一个 SQL 视图,将您的int字段转换为您需要的任何其他字段。或者,您可以保留现有实体,并使用intstringID 跨两列视图加入。查询优化器应该能够弄清楚您正在做什么以使性能影响可以忽略不计。

于 2009-08-08T22:38:48.853 回答