【问题标题】:LINQ to SQL entity to object conversionLINQ to SQL 实体到对象的转换
【发布时间】:2015-08-09 22:30:05
【问题描述】:

如您所知,LINQ to SQL 会生成自己的实体。 我尝试从数据库中获取数据并将其放入我自己创建的实体和类中。

当我这样做时:

        AppData.MyDBDataContext context = new AppData.MyDBDataContext();
        List<User> users = (from user in context.Users.Select(x => new User
        {
            Id = x.Id,
            Name = x.Name,
            Password = x.Password
        }) where user.Password == "123456" select user).ToList();

它有效(User 是我创建的一个类)。 但是当我尝试概括并构建一个强制转换函数时:

User castToUser (DataAccess.AppData.User linqEntity)
{
    return new User
    {
        Id = linqEntity.Id,
        Name = linqEntity.Name,
        Password = linqEntity.Password
    };
}

(DataAccess.AppData.User 是 LINQ to SQL 生成的实体)。

    AppData.MyDBDataContext context = new AppData.MyDBDataContext();
    List<User> users = (from user in context.Users.Select(x => castToUser(x)) where user.Password == "123456" select user).ToList();

它会抛出一个错误:Method 'DataAccess.Entities.User castToUser(DataAccess.AppData.User)' has no supported translation to SQL.

错误只是在更改时出现

new User
            {
                Id = x.Id,
                Name = x.Name,
                Password = x.Password
            }

到 castToUser(x),它返回相同的东西!

【问题讨论】:

    标签: c# .net linq linq-to-sql


    【解决方案1】:

    发生这种情况是因为 l2sql 试图翻译您的投影。相反,只需在检索到数据后让它进行投影:

    AppData.MyDBDataContext context = new AppData.MyDBDataContext();
    List<User> users = context.Users
       .Where( u => u.Password == "123456" )
       .ToList() // fetch
       .Select( u => castToUser( u ));
    

    一个建议 - 不要混合两种风格,linq 风格和扩展方法风格。这会降低可读性。

    【讨论】:

    • 谢谢,它有帮助。我的目标是用存储库抽象 DAL,但要实现完全抽象,我必须使用我自己的实体而不是 Linq to SQL 生成的实体。我还关心我将如何实现更新方法,更新方法在 linq 实体上查找记录的更改,但是当我将 linq 实体复制到我自己的实体中时,我对我的实体所做的更改不会'不会被记录下来。
    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 2011-10-22
    • 2023-03-03
    • 1970-01-01
    • 2013-05-03
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多