繁体   English   中英

在EF4.1和SQLCE中将Int连接到字符串

[英]Joining on Int to String in EF4.1 & SQLCE

我有两个数据库表:

  • “ MyTable”具有一个标准的自动递增主键整数字段。
  • “ UserAccess”表是一个映射表,其中包含通过组合键联接到所有系统的链接。

MyTable

ID              int    
IsDeleted       bit    
Email           varchar(255)   

UserAccess

UserID          guid    
ProviderID      int    
ProviderUserID  varchar(255)   

这两个表都是通过Entity Framework 4.1 Code First在我的应用程序中设置的。

主表(我的系统/提供者)具有自己的ID(例如42)。 它可以通过查找表中是否有ProviderID为42的记录来查找用户是否具有访问权限。

当试图通过将ProviderUserID(varchar)映射到表的主键(int)来查找MyTable的特定记录属于谁时,就会出现我的问题。 我无法更改ProviderUserID,因为有些系统使用字符串作为其主键(URL /电子邮件/等)。

可以使用SQL简单地解决此问题:

SELECT * FROM MyTable AS M
LEFT OUTER JOIN UserAccess AS U ON U.ProviderID = 42 AND M.ID = U.ProviderUserID

但是在Entity Framework中,更具体地说,是LINQ to Entities和SQL Compact Edition的组合 -我无法在运行时进行类型转换。

Convert.ToString()Convert.ToInt()这样的显而易见的候选者因为它是L2E而无法工作。 SqlFunctions.Convert不可用,因为这是SQL CE。

如果我退出SQL CE并可以使用SqlFunctions ,则此问题可能会消失,但是由于CE对于快速构建用于单元测试的有效DbContext非常有用-我对此并不感到兴奋-尽管我可以做到这一点。找不到解决方法。

我尝试了多种方法,每次都以不同的失败告终。 如果两种类型( UserAccess.ProviderUserIDMyTable.ID )是同一类型,则下面的一种会很好用-但它们不是:)

var data = (from m in DB.MyTable
            let userID = DB.UserAccess.Where(x => x.ProviderID == 42).FirstOrDefault(x => p.ID == x.ProviderUserID).UserID
            select new DomainModel()
            {
               ID = m.ID
               Email = m.Email,
               IsDeleted = m.IsDeleted,
               UserID =userID,
            });

是否对我要去哪里出错或可以采取哪些措施进行任何思考?

尽管这不是理想的解决方案,但它是我暂时确定的解决方案。

  • 我将单元测试使用的数据库更改为SQL Express数据库,这使我能够使用SqlFunctions类及其中的方法。

然后,我可以调整查询,使其看起来类似于以下内容:

var data = (from m in DB.MyTable
            join i in DB.UserAccess.Where(x => x.ProviderID == 42) on SqlFunctions.StringConvert((double)m.ID).Trim() equals i.ProviderUserID into useraccess
            from ua in useraccess.DefaultIfEmpty()
            select new DomainModel()
            {
               ID = m.ID
               Email = m.Email,
               IsDeleted = m.IsDeleted,
               UserID = ua.UserID,
            });

我会密切注意这个问题,如果有更好的答案,我会乐于赞成/更改我接受的答案。

除了ps之外,还添加了.Trim() ,因为初始的字符串转换是将充满空白的存储桶添加到字符串的开头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM